не может получить доступ к защищенной переменной в производном классе c ++ - PullRequest
1 голос
/ 22 октября 2010

У меня есть Бинарное дерево поиска как производный класс от Бинарного дерева, сейчас я пытаюсь получить доступ к корню для моих рекурсивных функций (который находится в базовом классе). Но по какой-то причине я продолжаю получать сообщение об ошибке:

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);
}

Я попытался сделать рут публичным, чтобы увидеть, что произойдет, и все равно получил ту же ошибку.

любая помощь будет высоко ценится!

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Я не знаю, почему это так, но при получении подклассов из шаблонных классов, чтобы получить доступ к членам, вам нужно добавить к ним префикс базового имени класса.

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

Мой компилятор, Visual C ++, этого не требует, но стандарт по какой-то причине. В качестве альтернативы вы можете поставить строку:

using binTree<T>::root;

в любой области, где это необходимо.

Редактировать: Мне сообщили, что вы можете просто использовать это:

this->root
0 голосов
/ 22 октября 2010

Без полного кода трудно сказать, но стоит отметить, что шаблоны классов, как правило, не отделяют код от объявлений, как здесь, как это обычно происходит с не шаблонными классами.

Я бы переместил код шаблона класса в ваши заголовочные файлы (так как вы, вероятно, захотите, чтобы он шел вперед) и посмотрел, каков будет результат. Если у вас все еще есть проблемы, отправьте измененный код с любыми соответствующими обновлениями к сообщениям об ошибках.

...