我希望创建一个TemplateClassB
实例,以使其私有(private)tcA
是带有TemplateClassA
的L =1
实例。程序产生错误:no matching function for call to 'TemplateClassA<>::TemplateClassA(TemplateClassA<1>)' : tcA(TemplateClassA<L>(2)){
如果将TemplateClassB更改为template <typename E, typename F, int L=5>
,则没有错误。为什么?如何解决?
template <int L=5>
class TemplateClassA {
public:
typedef unsigned TypeA;
TemplateClassA(int i)
: a(i+L){
}
int a;
};
template <typename E, typename F, int L=1>
class TemplateClassB {
public:
typename TemplateClassA<L>::TypeA var;
TemplateClassB()
: tcA(TemplateClassA<L>(2)){
}
TemplateClassA<> tcA;
};
int main(){
TemplateClassA<> A(1);
TemplateClassB<int, int> B;
}
最佳答案
tcA
是TemplateClassA<5> and you are trying to assign
TemplateClassA(2)`,它们是不同的类型。
template <typename E, typename F, int L=1>
class TemplateClassB {
public:
typename TemplateClassA<L>::TypeA var;
TemplateClassB()
: tcA(TemplateClassA<L>(2)){ // here L is 2
}
TemplateClassA<> tcA; // by default L=5
};
您需要编写类型转换函数或使
tcA
与TemplateClassA<1>
具有相同的类型这是:
TemplateClassA<L> tcA; // L is 1 now
// ^^^