C 多层类模板构造函数不编译



以下多级类模板不编译:

#include <iostream>
using namespace std;
template<typename T>
class A {
private:
  A(void);
  T _num_;
public:
  A(T num): _num_(num){};
  void printNum(void){
    cout << _num_ << "n";
  }
};
template<typename T>
class B : public A<T> {
private:
  B(void);
public:
  B(T num): A(num){};
};
class C : public B<int> {
private:
  C(void);
public:
  C(int num): B(num){};
};
int main()
{
  /* code */
  auto c = C(2);
  c.printNum();
  return 0;
}

错误:成员初始化器'a'不命名非静态数据成员或B类B(t num):a(num){};

错误:成员初始化器'b'未命名非静态数据成员或基类 c(int num):b(num){};

但是,删除模板符合问题而毫无问题。

#include <iostream>
using namespace std;
class A {
private:
  A(void);
  int _num_;
public:
  A(int num): _num_(num){};
  void printNum(void){
    cout << _num_ << "n";
  }
};
class B : public A {
private:
  B(void);
public:
  B(int num): A(num){};
};
class C : public B {
private:
  C(void);
public:
  C(int num): B(num){};
};
int main()
{
  /* code */
  auto c = C(2);
  c.printNum();
  return 0;
}

这个问题是语法错误。除了类"继承声明"之外,必须将打字名称t传递给派生类CTOR定义中的基本CTOR调用。

class B : public A<T> {//...
B(T num): A<T>(num){}; //NOTE: <T> added to A ctor call.

class C : public B<int> {//...
C(int num): B<int>(num){};  //NOTE: <int> added to B ctor call.

完整编译代码:

#include <iostream>
using namespace std;
template<typename T>
class A {
private:
  A(void);
  T _num_;
public:
  A(T num): _num_(num){};
  void printNum(void){
    cout << _num_ << "n";
  }
};
template<typename T>
class B : public A<T> {
private:
  B(void);
public:
  B(T num): A<T>(num){};
};
class C : public B<int> {
private:
  C(void);
public:
  C(int num): B<int>(num){};
};
int main()
{
  /* code */
  auto c = C(2);
  c.printNum();
  return 0;
}

最新更新