对此存在一些疑问,但是很多矛盾(A人给出了解决方案A',其中有很多人用B表示它是UB)或者“只有在编译器支持ADL时才有效”。
所以,说我有以下模板(容器)类:
template<typename T>
class C {
// ...
void swap(C<T>& y) throw(); // C x; x.swap(y);
}
那么确保这个(示例)代码有效的正确方法是什么:
C<int> x, y;
std::swap(x, y);
请给出C ++ 03的答案,如果它仍然可以在C ++ 0x中运行,那就更好了!
答案 0 :(得分:6)
不允许在std-namespace中重载函数。
将swap声明为自由函数,在与类C
相同的命名空间中重载:
template<class T>
void swap(C<T>& x, C<T>& y) { x.swap(y); }
交换的正确方法是导入std :: swap并使用非限定版本(通过基于命名空间的Koenig查找返回):
template<class T>
void dostuff(T x, T y) {
...
using std::swap;
swap(x,y);
...
}
如果x是C,则使用C :: swap,对于没有自己交换的类型,将使用std :: swap。
(如上所述导入std :: swap仅在模板函数中是必需的,其中类型未知。如果你知道你有C,那么你可以立即使用x.swap(y)w / o问题。)