2010-10-22 2 views
1

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

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

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

любая помощь будет очень признательна!

+0

Можем ли мы увидеть полноту (по крайней мере, до линии 31) binSTree.h пожалуйста? –

+0

уверен, что я могу сделать – rajh2504

+0

И если вы хотите узнать, почему это происходит ... http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19 –

ответ

1

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

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

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

using binTree<T>::root; 

в любых областях, которые в этом нуждаются.

Edit: Я был проинформирован heavyd, что вы можете просто использовать это:

this->root 
+0

Использование 'this-> root', похоже, работает и для gcc. – heavyd

+0

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

+0

Большое вам спасибо, что это большая помощь! – rajh2504

0

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

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

+0

Оба класса и все их объявления уже находятся в файлах заголовков, если я правильно понимаю ваш ответ. – rajh2504

+0

@Greg - ваше обновление опубликованного кода делает это ясным, спасибо. –

Смежные вопросы