C ++,错误:无效使用qualified-name

时间:2016-12-27 05:38:35

标签: 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* 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.很快,我的课程如下。

//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]'   

可能是关于内部类TreeNode的构造函数。当我在main()中使用RBTree :: insert()来创建'root'节点时,会发生错误。

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

1 个答案:

答案 0 :(得分:0)

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

至于第二个错误,你有一个无限递归。您正在尝试定义NIL的值,但由于您未提供所有参数,因此使用了默认参数,这意味着您实际上已声明

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

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