2016-12-27 11 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); 
} 

私は内部クラスのTreeNodeのコンストラクタについて多分

[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分で1つの質問しかできないという事実のために、私はそれに2つの質問を書いています。

答えて

0

静的データメンバーは、名前空間のスコープで定義する必要があります。あなたはクラスのスコープでそれを定義しようとしていました。

2番目のエラーについては、無限の再帰があります。あなたはNILの値が何であるかを定義しようとしているが、あなたはすべての引数を提供していないので、デフォルトの引数が使用されている、あなたが効果的に

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

を宣言していることを意味するたぶん、あなたはデフォルト引数を対象とし代わりにnullptrになります。

+0

umしかし、2番目の質問はどうですか?私はそれが完了したようにするために挿入機能を追加しました。 – wind2412

+0

@ wind2412:私はそのエラーを再現できません。エラーはあなたが投稿しなかったコードに関するものだと思われます。 –

+0

@ wind2412:このエラーは、2つの引数を取るTreeNodeコンストラクタについてのものです。 –