【发布时间】:2014-09-23 19:57:30
【问题描述】:
下面将调用模板化的复制构造函数。
#include <iostream>
using namespace std;
class A
{
public:
A(){ cout << "Class A constructor\n";}
A(const A &a){ cout << "Class A copy constructor\n"; }
};
class B : public A
{
public:
B(){ cout << "Class B constructor\n";}
B(const B &a){ cout << "Class B copy constructor\n"; }
};
template <typename T>
class Template
{
public:
Template() { cout << "Template default\n"; }
Template(const Template &a) { cout << "Template copy constructor\n"; }
// This gets called
template <typename T2>
Template(const Template<T2> &a)
{
cout << "Templated template copy constructor\n";
}
};
void funcT(const Template<A> &a)
{
}
int main()
{
Template<B> bt;
cout << "Calling funcT(bt)\n";
funcT(bt);
return 0;
}
如何防止调用模板化的复制构造函数?我期待由于B 是A 类型,并且我通过引用传递,所以不会调用任何构造函数。我创建了一个专门的复制构造函数,希望它会被调用:
Template(const Template<A> &a)
{
cout << "Specialized templated template copy constructor\n";
}
但这不会编译。
基本上我不想在调用funcT()时调用现有的三个构造函数。
【问题讨论】:
-
确实做到了
explicit是你需要的like in this demo 吗? -
Template<B> != Template<A>老兄,这就是调用模板转换构造函数的原因。 -
请注意:模板构造函数永远不是(!)复制构造函数
-
好的,有道理。是为 A 创建专门的模板类的唯一选择吗?
-
@user2233706:将构造函数设为
explicit,或删除模板化构造函数,改为提供explicit operator Template<T2>(),或在构造函数中添加enable_if条件