2016-12-27 15 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构造函数。 –