【问题标题】:C++ Multi-level Class Template Constructors Do Not CompileC++ 多级类模板构造函数不编译
【发布时间】:2019-02-24 17:30:01
【问题描述】:

以下多级类模板无法编译:

#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(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;
}

【问题讨论】:

    标签: c++ class templates constructor multi-level


    【解决方案1】:

    这个问题是一个语法错误。除了类继承声明之外,类型名 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2017-10-01
      • 2021-03-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-08
      相关资源
      最近更新 更多