我正在尝试创建一个从Tree类继承的Binary Search Tree类,但是编译器说Tree类的数据成员不在BST类中继承。
template <class T>
class Tree {
protected:
class Node {
public:
T value;
Node * left;
Node * right;
};
Node * root;
public:
Tree() : root(NULL) { }
};
template <class T>
class SearchTree : public Tree<T> {
public:
void foo();
};
template <class T>
void SearchTree<T>::foo() {
Node * node = NULL; //error- Unknown type name 'Node'
root = node; //error- Use of undeclared identifier 'root'
}
我希望能够从基类“ Tree”访问Node和root。为什么编译器说它们是未声明的和未知的?
答案 0 :(得分:4)
当基类依赖于模板参数时,其范围is not examined [temp.dep / 4]:
在类或类模板的定义中,在类模板或成员的定义时或在类模板或成员的实例化期间的不合格名称查找期间,不会检查从属基类的范围。
使用this->
引用基类数据成员,使用Tree<T>::
引用成员类型:
template<class T>
void SearchTree<T>::foo() {
typename Tree<T>::Node * node = NULL;
this->root = node;
}
Tree<T>::Node
是从属类型,因此应在其前面加上typename
关键字。
或者,您可以使用using
声明来引入名称:
template<class T>
class SearchTree : public Tree<T> {
public:
void foo();
protected:
using typename Tree<T>::Node;
using Tree<T>::root;
};