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

C++03: keep default copy constructor when using template constructor

假设我创建了一个 class 带有模板构造函数以稍后定义实现:

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 不支持默认模板参数。这里有什么解决方法吗?

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

您无需执行任何操作。编译器生成的 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
}

输出:

template