想象一下,我创建了一个带有模板构造函数的类,以便稍后定义实现:
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不支持默认模板参数。这里有解决方法吗?
答案 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
,这与实际的复制构造函数相同,因此非模板构造函数将是首选。