在我设法为我的类类型重载std::swap
之后,我现在想要专门化它,而不是重载它,因为标准允许向名称空间std
添加模板专门化。下面是我的例子:
class Foo{
public:
Foo(){
std::cout << "Foo()\n";
}
Foo(Foo const&){
std::cout << "Foo(Foo const&)\n";
}
Foo(Foo&&){
std::cout << "Foo(Foo&&)\n";
}
Foo& operator=(Foo const&){
std::cout << "operator=(Foo const&)\n";
return *this;
}
Foo& operator=(Foo&&){
std::cout << "operator=(Foo&&)\n";
return *this;
}
~Foo(){
std::cout << "~Foo()\n";
}
};
class VecFoo;
namespace std{
template <>
void swap<VecFoo>(VecFoo&, VecFoo&);
}
class VecFoo{
Foo* pFoo_ = new Foo[10];
template<>
friend void std::swap<VecFoo>(VecFoo&, VecFoo&);
};
template <>
void std::swap<VecFo>(VecFoo& lhs, VecFoo& rhs){
std::cout << "template <> void std::swap(VecFoo&, VecFoo&)\n";
std::swap(lhs.pFoo_, rhs.pFoo_);
}
int main(){
VecFoo vf1, vf2;
using std::swap;
swap(vf1, vf2);
}
/usr/include/C++/10/type_traits2195需要替换“template使用_require=std::__enable_if_t>::value>”[with_cond={std::__not_>,std::is_move_constructable,std::is_move_assignable
那么这里的问题是什么,我怎样才能正确地对它进行专门化呢?
vecfoo
课上没有达到的RAII和那里的内存泄漏,因为这不是我的问题。
这真的很简单。您不需要模板,但确实需要在正确的名称空间中。
namespace std {
void swap(VecFoo& lhs, VecFoo& rhs) {
std::cout << "void swap(VecFoo&, VecFoo&)\n";
//do your custom swap here!!!
}
}