最小例子
class A { friend void swap(A& first,A& second) {} void swap(A& other) {} void call_swap(A& other) { swap(*this,other); } }; int main() { return 0; }
g 4.7说:
friend.cpp: In member function ‘void A::call_swap(A&)’: friend.cpp:7:20: error: no matching function for call to ‘A::swap(A&,A&)’ friend.cpp:7:20: note: candidate is: friend.cpp:4:7: note: void A::swap(A&) friend.cpp:4:7: note: candidate expects 1 argument,2 provided
流血线4:
// void swap(A& other) {}
解决方法
我相信这是因为编译器正在尝试在类中查找该函数.这应该是一个简单的更改,使其工作(它在Visual Studio 2012中工作):
class A; // this and the next line are not needed in VS2012,but void swap(A& first,A& second); // will make the code compile in g++ and clang++ class A { friend void swap(A& first,A& second) {} void swap(A& other) {} void call_swap(A& other) { ::swap(*this,other); // note the scope operator } }; int main() { return 0; }