【问题标题】:Derived class not inheriting data members from Base class [duplicate]派生类不从基类继承数据成员[重复]
【发布时间】:2019-06-26 18:05:42
【问题描述】:

我正在尝试创建一个继承自 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) { }
};

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'
}

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

【问题讨论】:

  • 使用Tree&lt;T&gt;::Node 代替Node。您需要明确继承的嵌套类。

标签: c++ inheritance inner-classes


【解决方案1】:

当基类依赖于模板参数时,其作用域is not examined [temp.dep/4]:

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

使用this-&gt; 引用基类数据成员,使用Tree&lt;T&gt;:: 引用成员类型:

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

Tree&lt;T&gt;::Node 是依赖类型,所以应该以typename 关键字为前缀。

或者,您可以使用using 声明来引入名称:

template<class T>
class SearchTree : public Tree<T> {
public:
    void foo();

protected:
    using typename Tree<T>::Node;
    using Tree<T>::root;
};

【讨论】:

  • 谢谢,这适用于基类数据成员(根),但 Tree:: 没有解决 Node 的问题
  • @EzraDweck,我忘了typename。更正了答案。
猜你喜欢
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
  • 2014-12-23
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多