无法在派生类c ++中访问受保护的变量

时间:2010-10-22 02:35:04

标签: c++ binary-tree derived-class

我有二进制搜索树作为二叉树的派生类,现在我正在尝试访问我的递归函数的根(在基类中)。但由于某种原因,我不断收到错误:

binSTree.h:31: error: ‘root’ was not declared in this scope

以下是我的班级声明:

基类:

template <class T>
class binTree {
private:

  int height(treeNode<T>*) const;          // Recursive method
  int size(treeNode<T>*) const;            // Recursive method
  int leaves(treeNode<T>*) const;

  void insert(treeNode<T>*&, const T&);

  void clear(treeNode<T>*);
  treeNode<T>* copy_tree(treeNode<T>*);

  void preOrder(treeNode<T>*, void (*)(T&));
  void inOrder(treeNode<T>*, void (*)(T&));
  void postOrder(treeNode<T>*, void (*)(T&));
public:
   binTree();
   binTree(const binTree<T>&);
   ~binTree();

   bool empty() const;

   void clear();

   void insert(const T&);
   int remove(const T&);                 // Extra credit only

   int height() const;                   // Non-recursive method
   int size() const;                     // Non-recursive method
   int leaves() const;

   void preOrder(void (*)(T&));
   void inOrder(void (*)(T&));
   void postOrder(void (*)(T&));

   const binTree<T>& operator=(const binTree<T>&);
protected:
   treeNode<T>* root;
};

头文件(到第31行):

#include "binTree.h"

template<class T>
class binSTree : public binTree<T> {
public:
  void insert(const T&);
  bool remove(const T&);
  bool search(const T&, int&) const;
private:
  void insert(treeNode<T>*&, const T&);
  bool remove(treeNode<T>*&, const T&);
  bool search(treeNode<T>*, const T&, int&);
  void remove_root(treeNode<T>*&);
};

template<class T>
void binSTree<T>::insert(const T& x) {
treeNode<T>* newNode = new treeNode<T>(x);
insert(newNode, x);
}

template<class T> // public
bool binSTree<T>::remove(const T& x) {
return remove(binTree<T>.root, x);
}

template<class T> // public
bool binSTree<T>::search(const T& x, int& len) const {
len = 0;
len = search(root,x,len);
}

我尝试让root公开看看会发生什么,但我仍然遇到同样的错误。

任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

我不知道为什么会这样,但是当从模板类进行子类化时,为了访问成员,你需要在它们前面添加基类名称。

len = search( binTree<T>::root, x,len);

我的编译器Visual C ++不需要这个,但标准出于某种原因。或者,你可以把这行:

using binTree<T>::root;

在任何需要它的范围内。

编辑:我被heavyd告知你可以使用它:

this->root

答案 1 :(得分:0)

如果没有完整的代码,很难说,但值得注意的是,类模板通常不会像在此处那样将代码与声明分开,并且非模板类也是如此。

我会将类模板代码移动到您的头文件中(因为这是您可能希望它继续前进的方式)并查看结果是什么。如果您仍然遇到问题,请使用错误消息的任何相关更新发布修改后的代码。