派生类不从基类继承数据成员

Ezr*_*eck 2 c++ inheritance inner-classes

我正在尝试创建一个继承自 Tree 类的二叉搜索树类,但编译器表示 Tree 类的数据成员未在 BST 类中继承。

树.h

template <class T>
class Tree {
protected:
    class Node {
    public:
        T value;
        Node * left;
        Node * right;
    };
    Node * root;
public:
    Tree() : root(NULL) { }
};
Run Code Online (Sandbox Code Playgroud)

BST.h

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'
}
Run Code Online (Sandbox Code Playgroud)

我希望能够从基类“Tree”访问节点和根。为什么编译器说它们未声明且未知?

Evg*_*Evg 5

当基类依赖于模板参数时,不检查其范围[temp.dep/4]:

在类或类模板的定义中,在类模板或成员的定义点或类模板或成员的实例化期间进行非限定名称查找期间,不会检查依赖基类的范围。

用于this->引用基类数据成员和Tree<T>::引用成员类型:

template<class T>
void SearchTree<T>::foo() {
    typename Tree<T>::Node * node = NULL;
    this->root = node;
}
Run Code Online (Sandbox Code Playgroud)

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;
};
Run Code Online (Sandbox Code Playgroud)