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]'
может быть, о конструкторе внутреннего TreeNode класса. Ошибка возникает, когда я использую RBTree :: insert() в main() для создания «корневого» узла.
Я не знаю почему. Возможно, очень интересно исследовать статический член. И спасибо за то, что вы прочитали мой вопрос. В связи с тем, что через 90 минут можно задать только один вопрос, поэтому я пишу в нем два вопроса .. Thx!
Умм, но как насчет второго вопроса? Я добавил функцию вставки, чтобы она казалась завершенной. – wind2412
@ wind2412: Я не могу воспроизвести эту ошибку. Похоже, что ошибка связана с кодом, который вы не опубликовали. –
@ wind2412: Ошибка говорит о конструкторе TreeNode, который принимает два аргумента. –