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>
时,它正常工作。我的模板有问题吗?
答案 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
。