2010-10-22 84 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的嗎? – 2010-10-22 02:40:00

+0

當然!我可以做 – rajh2504 2010-10-22 02:45:04

+0

如果您想了解爲什麼會發生這種情況...... http://www.parashift.com/c++-faq-lite/templates.html#faq-35.19 – 2010-10-22 04:13:30

回答

1

我不知道這是爲什麼,但是當從模板類進行子分類時,爲了訪問成員,你需要在它們前面加上基類名。

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

我的編譯器時,Visual C++,並不需要這一點,但標準確實出於某種原因。或者,你可以把線:

using binTree<T>::root; 

在任何需要它的範圍。

編輯:我被heavyd,你可以只使用此告知:

this->root 
+0

使用'this-> root'似乎也適用於gcc。 – heavyd 2010-10-22 03:06:10

+0

啊,所以它。這好多了。我不多使用繼承,更不用說模板類的繼承了,所以這些東西讓我無法逃脫。 – 2010-10-22 03:10:50

+0

非常感謝你們這是一個很大的幫助! – rajh2504 2010-10-22 03:18:30

0

沒有完整的代碼很難說,但值得注意的是,類模板通常不會像您在這裏那樣將代碼從聲明中分離出來,而且與非模板類相似。

我會將類模板代碼移動到頭文件中(因爲這是您可能希望它前進的方式)並查看結果是什麼。如果您仍然遇到問題,請將修改後的代碼與錯誤消息的任何相關更新進行發佈。

+0

這兩個類並且如果我正確理解你的響應,它們的所有聲明都已經在頭文件中。 – rajh2504 2010-10-22 02:44:27

+0

@Greg - 您發佈的代碼的更新說明了這一點,謝謝。 – 2010-10-22 10:25:29

相關問題