我希望创建一个TemplateClassB实例,以使其私有(private)tcA是带有TemplateClassAL =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;

}

最佳答案

tcATemplateClassA<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
};

您需要编写类型转换函数或使tcATemplateClassA<1>具有相同的类型
这是:
TemplateClassA<L> tcA;  // L is 1 now
//            ^^^

10-08 10:47