C++中swap函数的特化,使用XCode发现的问题,有关target membership

sinat_21752067 2015-03-14 09:53:16
用XCode写C++的代码,代码如下:



#include<utility>



class Widget

{

public:

Widget();

Widget(Widget &);

Widget &operator=(Widget &);

void swap(Widget &);

private:

int x;

};



Widget::Widget()

{

x = 1;

}



Widget::Widget(Widget &rhs) :x(rhs.x)

{



}



Widget &Widget::operator=(Widget &rhs)

{

x = rhs.x;

return *this;

}



void Widget::swap(Widget &other)

{

using std::swap;

swap(x, other.x);

}



namespace std

{

template<>

void swap<Widget>(Widget &a, Widget &b)

{

a.swap(b);

}

}



int main()

{

Widget a;

Widget b;

std::swap(a, b);

return 0;

}



只是想试试swap的特化而已,结果一直编译不成功,提示no function template matches function template specialization 'swap'.

在VS里面能成功编译。



后来无意间把target membership里面的勾给去掉了,结果就编译成功了。



所以想知道为什么勾上了target membership之后就不能编译了。。。



平常只是用XCode简单的打打代码,不是很了解这些东西。



希望高人指教。
...全文
503 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
ri_aje 2016-07-16
  • 打赏
  • 举报
回复
标准不允许这么扩展 std 的,不要这样写。 至于这个例子,你把 move 语意加上应该就可以了。

  Widget(Widget &&);
  Widget &operator=(Widget &&);
oj_fang 2016-07-15
  • 打赏
  • 举报
回复
特化std::swap 接下来我们示范利用模板特化的方法使用boost::swap。用一个简单的三维空间的点point作为例子,它实现了内部高效的交换函数: class point { int x, y, z; public: explicit point(int a=0, int b=0, int c=0):x(a),y(b),z(c){} void print()const { cout << x <<","<< y <<","<< z << endl; } void swap(point &p) //内置高效交换函数 { std::swap(x, p.x); std::swap(y, p.y); std::swap(z, p.z); cout << "inner swap" << endl; } }; 特化std::swap()的方法需要向std名字空间添加自定义函数(虽然原则上是不允许变动std名字空间的),代码如下: namespace std { template<> void swap(point &x, point &y) //模板特化swap函数 {x.swap(y);} } int main() { point a(1,2,3), b(4,5,6); cout << "std::swap" << endl; std::swap(a,b); //调用std::swap cout << "boost::swap" << endl; boost::swap(a, b); //调用boost::swap } 程序运行结果如下: std::swap inner swap boost::swap inner swap 由于我们在名字空间特化了std::swap,因此,boost::swap与std::swap的效果相同,都使用了特化后的swap函数。
sinat_21752067 2015-03-15
  • 打赏
  • 举报
回复
求高人指点啊
yshuise 2015-03-15
  • 打赏
  • 举报
回复
函数最好不要特化,因为他的优先级还没有普通函数高。 只有类特化优先级比不特化高。 还有的用法是错误的,现有主模板函数,然后才特化。
yshuise 2015-03-15
  • 打赏
  • 举报
回复
swap是个著名的用法

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧