2016-12-27 17 views
0

1.I做了如下:C++,錯誤:無效的使用合格的名稱

template <class T> 
class RBTree{ 
public: 
    struct TreeNode{ 
     T data; 
     bool color; 
     TreeNode* left; 
     TreeNode* right; 
     TreeNode* parent; 
     static TreeNode* NIL; 

     TreeNode(T data, TreeNode* parent, TreeNode* left = NIL, TreeNode* right = NIL) 
         :data(data), color(RED), left(left), right(right), parent(parent){} 
    } 
    TreeNode* TreeNode::NIL = new TreeNode(-1, nullptr); 
}; 

而且它拋出我的錯誤...

[Error] invalid use of qualified-name 'RBTree<T, Comp>::TreeNode::NIL' 

我真的不知道爲什麼...之後我做了全班RBTree,吹塑,它的工作原理之外...

template <class T> 
class RBTree{ 
... 
}; 

template <class T> 
typename RBTree<T>::TreeNode* RBTree<T>::TreeNode::NIL = new TreeNode(-1, nullptr); 

但我不知道爲什麼我在第一時間得到了一個錯誤?

我覺得語法可能是正確的......

2.Soon我做了如下我的課。

//in RBTree.hpp 
template <class T> 
class RBTree{ 
public: 
    ... //the same as above 
private: 
    TreeNode* root; 
}; 
template <class T> 
typename RBTree<T>::TreeNode* RBTree<T>::TreeNode::NIL = new TreeNode(-1, nullptr); 

//in RBTree_IMPL.hpp 
template <class T> 
void RBTree<T>::insert(const T & data){ 
    if(root == nullptr){ 
     root = new TreeNode(data, nullptr); 
     ... 
    } 
    ... 
} 

//in RBTree_test.cpp 
int main(){ 
    RBTree<int> rb; 
    rb.insert(3); 
} 

我得到了很多錯誤,像

[Error] recursive evaluation of default argument for 'RBTree<T>::TreeNode::TreeNode(T, RBTree<T>::TreeNode*, RBTree<T>::TreeNode*, RBTree<T>::TreeNode*) [with T = int]' 

也許對內部類樹節點的構造函數。當我在main()中使用RBTree :: insert()來創建'root'節點時,會發生錯誤。

我不知道爲什麼。探測靜態成員可能非常有趣。並感謝您閱讀我的問題。由於90分鐘內只能提出一個問題,所以我在其中寫了兩個問題...... Thx!

回答

0

靜態數據成員必須在命名空間範圍內定義。你試圖在類範圍內定義它。

至於第二個錯誤,你有一個無限遞歸。您正在試圖確定什麼NIL的值,但由於您沒有提供所有參數,正在使用默認參數,這意味着你實際上宣告

template <class T> 
typename RBTree<T>::TreeNode* RBTree<T>::TreeNode::NIL = 
    new TreeNode(-1, nullptr,NIL,NIL); 

也許你打算在默認參數改爲nullptr。

+0

嗯,但第二個問題呢?我添加了插入功能,以使它看起來完成。 – wind2412

+0

@ wind2412:我無法重現該錯誤。這似乎是錯誤是關於你沒有發佈的代碼。 –

+0

@ wind2412:錯誤是在談論一個帶有兩個參數的TreeNode構造函數。 –