【问题标题】:How to call constructor of a template base class in a template derived class?如何在模板派生类中调用模板基类的构造函数?
【发布时间】:2014-09-23 17:30:34
【问题描述】:

假设我有一个基模板类数组:

template <class T = Point> class Array{
    protected:
        T* m_data;
        int size;
    public:
        Array();    // constructor
        Array(int n);   // constructor
        Array(const Array<T>& s_data);  //Copy Constructor
        // and so on..
}

它有构造函数和析构函数。我还有一个派生的模板类 NumericArray:

template <class T = int> 
class NumericArray:public Array<T>{

    public:
        NumericArray();
        NumericArray(int n);
        NumericArray(const NumericArray<T>& s_data);

        ~NumericArray();    //destructor

};

由于我需要在基类中初始化私有成员,所以我需要在派生构造函数中调用基构造函数。但是怎么做?我试过了

template <class T>
NumericArray<T>::NumericArray(int n){
    Array<T>(n);  // it will think I create a Array<T> names n
}

template <class T>
NumericArray<T>::NumericArray(int n):Array(n){
    // No field in NumericalArray called Array
}

有什么想法吗?

【问题讨论】:

  • 为什么你没有尝试其他 2 个变种,只是好奇?
  • @Slava 我做到了。以这个为例。
  • 如果你这样做了,你会打对路

标签: c++ templates


【解决方案1】:

结合您的解决方案,使用初始化列表和全名:

NumericArray<T>::NumericArray(int n)
 : Array<T>(n)
{

}

此外,由于它们成为依赖名称,因此必须像这样访问 Array 的字段:

Array<T>::m_data; // inside a NumericArray method

另外,如果不是一些实验或作业,请使用 std::vector 代替指针和大小。

【讨论】:

  • 这……太棒了。我想我以前试过这个(但失败了),但这次它起作用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-20
  • 2011-10-05
  • 1970-01-01
  • 1970-01-01
  • 2021-08-09
  • 2017-09-12
  • 1970-01-01
相关资源
最近更新 更多