我有这样的代码:
#include <utility>
#include <iostream>
struct thing {
void swap(thing & other){
std::cout << "swap method" << std::endl;
}
};
void swap(thing & a, thing & b) {
std::cout << "swap function" << std::endl;
a.swap(b);
}
struct another{
thing a;
};
int main(int argc, char** argv){
another a, b;
std::swap(a, b);
}
如果执行,它什么都不打印 - 例如它不使用我的“自定义”swap
。
我读过我不应该std :: swap specialization。
我是否需要为班级another
进行自定义交换,或者我遗失了什么?
答案 0 :(得分:6)
std::swap
不会致电您的swap
实施。你应该做的(在通用代码中)是让重载决策选择你自己:
namespace stuff
{
struct foo { void swap(foo& other); };
swap(foo& lhs, foo& rhs) { lhs.swap(rhs); }
}
int main()
{
foo a, b;
int i = 0;
int j = 42;
using std::swap;
swap(i, j); // calls std::swap
swap(a, b); // calls stuff::swap(stuff::foo&, stuff::foo&) via ADL
}
答案 1 :(得分:1)
您的swap
期待thing
。这是你想要的吗?
int main(int argc, char** argv){
another a, b;
using std::swap; // let the compiler decide which swap to use
swap(a.a, b.a); // calls swap(thing & a, thing & b) and thing.swap
}
答案 2 :(得分:0)
您明确呼叫std::swap
- 没有理由应该调用自定义方法。
但是如果你改变了这一点 - 请务必更改方法的界面 - 在这种形式下,编译错误将会发生。