提问者:小点点

如何为我的类型适当地专门化std::swap?


在我设法为我的类类型重载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和那里的内存泄漏,因为这不是我的问题。

共1个答案

匿名用户

这真的很简单。您不需要模板,但确实需要在正确的名称空间中。

namespace std {
void swap(VecFoo& lhs, VecFoo& rhs) {
    std::cout << "void swap(VecFoo&, VecFoo&)\n";
    //do your custom swap here!!!
}
}