C++ C++;,错误:限定名称的使用无效

C++ C++;,错误:限定名称的使用无效,c++,C++,1.我做了如下事情: 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*

1.我做了如下事情:

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);
};
模板
类RBTree{
公众:
树状结构{
T数据;
颜色;
TreeNode*左;
TreeNode*对;
TreeNode*父代;
静态树节点*NIL;
树节点(T数据,树节点*父节点,树节点*左=零,树节点*右=零)
:数据(数据),颜色(红色),左(左),右(右),父(父){
}
TreeNode*TreeNode::NIL=新的TreeNode(-1,nullptr);
};
这给了我一个错误

[Error] invalid use of qualified-name 'RBTree<T, Comp>::TreeNode::NIL'
[Error]限定名“RBTree::TreeNode::NIL”的使用无效
我真的不知道为什么。。。在我在全班之外做了之后,作为打击,它起作用了

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

template <class T>
typename RBTree<T>::TreeNode* RBTree<T>::TreeNode::NIL = new TreeNode(-1, nullptr);
模板
类RBTree{
...
};
模板
typename RBTree::TreeNode*RBTree::TreeNode::NIL=新的TreeNode(-1,nullptr);
但我不知道为什么我第一次出错

我认为语法可能是正确的

2.很快我就完成了以下课程

//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);
}
//在RBTree.hpp中
模板
类RBTree{
公众:
…//同上
私人:
树根;
};
模板
typename RBTree::TreeNode*RBTree::TreeNode::NIL=新的TreeNode(-1,nullptr);
//在RBTree_IMPL.hpp中
模板
void RBTree::insert(常量和数据){
if(root==nullptr){
根=新树节点(数据,空PTR);
... 
}
...
}
//在RBTree_test.cpp中
int main(){
rb树rb;
rb.插入(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]'   
[Error]递归计算'RBTree::TreeNode::TreeNode(T,RBTree::TreeNode*,RBTree::TreeNode*,RBTree::TreeNode*)[T=int]的默认参数
也许是关于内部类TreeNode的构造函数。当我使用main()中的RBTree::insert()创建“根”节点时,会发生错误


我不知道为什么。探测静态成员可能非常有趣。谢谢你阅读我的问题。因为在90分钟内只能问一个问题,所以我写了两个问题。。谢谢

静态数据成员必须在命名空间范围内定义。您试图在类范围内定义它

至于第二个错误,您有一个无限递归。您试图定义NIL的值是什么,但由于没有提供所有参数,因此使用了默认参数,这意味着您正在有效地声明

template <class T>
typename RBTree<T>::TreeNode* RBTree<T>::TreeNode::NIL = 
    new TreeNode(-1, nullptr,NIL,NIL);
模板
typename RBTree::TreeNode*RBTree::TreeNode::NIL=
新的树节点(-1,nullptr,NIL,NIL);

也许您打算将默认参数改为nullptr。

嗯,但是第二个问题呢?我添加了insert函数以使其看起来已完成。@wind2412:我无法重现该错误。错误似乎与您没有发布的代码有关。@wind2412:错误是关于一个接受两个参数的TreeNode构造函数。我的错。首先,我想使我的代码整洁。但这似乎有负面影响。现在我已经把有用的代码全部放在了网站上。明白了。非常感谢。