2016-12-27 2 views
0

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!

ответ

0

Статические элементы данных должны быть определены в области пространства имен. Вы пытались определить его в классе.

Что касается второй ошибки, у вас есть бесконечная рекурсия. Вы пытаетесь определить, что значение NIL есть, но так как вы не обеспечиваете все аргументы, которые используются аргументы по умолчанию, что означает, что вы фактически объявляя

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

Может быть, вы предназначены для аргументов по умолчанию вместо этого будет nullptr.

+0

Умм, но как насчет второго вопроса? Я добавил функцию вставки, чтобы она казалась завершенной. – wind2412

+0

@ wind2412: Я не могу воспроизвести эту ошибку. Похоже, что ошибка связана с кодом, который вы не опубликовали. –

+0

@ wind2412: Ошибка говорит о конструкторе TreeNode, который принимает два аргумента. –

Смежные вопросы