C++ C++;,错误:限定名称的使用无效
1.我做了如下事情: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*
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构造函数。我的错。首先,我想使我的代码整洁。但这似乎有负面影响。现在我已经把有用的代码全部放在了网站上。明白了。非常感谢。