C ++ 03:使用模板构造函数时保留默认的复制构造函数

时间:2015-01-22 13:20:07

标签: c++ copy-constructor c++03

想象一下,我创建了一个带有模板构造函数的类,以便稍后定义实现:

struct A {
    template<typename T>
    A(const T& arg);
};

如何避免覆盖编译器隐式生成的复制构造函数A(const A&)?在C ++ 11中,我可以执行类似

的操作
#include <type_traits>
struct A {
    template<typename T, class = 
        typename std::enable_if<std::is_same<A, T>::value>::type>
    A(const T& arg);
};

它有效。但是C ++ 03不支持默认模板参数。这里有解决方法吗?

2 个答案:

答案 0 :(得分:3)

你不需要做任何事情。编译器生成的coppy构造函数将根据需要启动。复制构造函数不能是模板。例如,

#include <iostream>

struct A {
    template<typename T>
    A(const T& arg) { std::cout << "template\n"; }
};

int main()
{
    A a(42);  // template ctor
    A b(a);   // copy ctor
    A c = b;  // copy ctor
}

输出:

  

模板

答案 1 :(得分:1)

你不应该需要一个。当给定A(const A&)时,有问题的构造函数将实例化为A,这与实际的复制构造函数相同,因此非模板构造函数将是首选。