无法在派生模板类中引用基类成员

时间:2017-01-16 17:56:44

标签: c++ templates inheritance

template <class T>class Array
{
protected :
    T* data;
    int size;
};
template<class T>class Stack : protected Array<T>
{
    int top;
public:
    Stack(){};

public:
    void Push(T x) {data[++top] = x;}
};

为什么要说&#39;&#34;数据&#34;未在此范围内宣布&#39;在Push?我怎样才能解决这个问题?当我删除每个template<T>时,它正常工作。我的模板有问题吗?

2 个答案:

答案 0 :(得分:7)

你需要:

template <class T>class Array
{
protected :
    T* data;
    int size;
};
template<class T>class Stack : protected Array<T>
{
    int top;
public:
    Stack(){};

public:
    // void Push(T x) {data[++top] = x;} <-- Won't compile
    void Push(T x) {this->data[++top] = x;}  // <-- Will compile
    // void Push(T x) {Array<T>::data[++top] = x;} <-- Will also compile
};

因为在从类模板派生的类模板的实现中, 基本模板的成员必须通过this指针或引用 具有基础资格。

答案 1 :(得分:2)

作为@ Mike答案的补充,您可以考虑使用使用声明

template <class T>class Array
{
protected :
    T* data;
    int size;
};
template<class T>class Stack : protected Array<T>
{
    using Array<T>::data; // <--- HERE
    int top;
public:
    Stack(){};

public:
    void Push(T x) {data[++top] = x;}
};

现在data类可以使用Stack