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分钟内只能提出一个问题,所以我在其中写了两个问题......谢谢!
答案 0 :(得分:0)
必须在命名空间范围内定义静态数据成员。您试图在类范围内定义它。
至于第二个错误,你有一个无限递归。您正在尝试定义NIL的值,但由于您未提供所有参数,因此使用了默认参数,这意味着您实际上已声明
template <class T>
typename RBTree<T>::TreeNode* RBTree<T>::TreeNode::NIL =
new TreeNode(-1, nullptr,NIL,NIL);
也许您打算将默认参数改为nullptr。