2011-10-19 54 views
0

我有一個類:錯誤:預期型,得到了「結構」 C++

template <typename T> 
class btree { 

    public: 
    btree(size_t maxNodeElems); 
    ~btree() {} 

    struct node { 
     list <T> elements; 
     node *lvl; 
    }; 

    private: 
    size_t maxNodeElems; 
    node* root; 

}; 

template <typename T> 
btree<T>::btree(size_t maxNodeElems) { 
    if (maxNodeElems > 0) maxNodeElems = maxNodeElems; 
    root = new node; 
    root->lvl = new node[maxNodeElems+1]; 
} 

template <typename T> 
pair <typename btree<T>::iterator, bool> btree <T>::insert (const T& elem) { 
    pair <btree<T>::node, bool> start; 
    start = addElement (elem, *root); 
    pair <typename btree<T>::iterator, bool> final; 
    return final; 
} 

template <typename T> 
pair <btree<T>::node, bool> btree<T>::addElement (const T& e, btree<T>::node*& n) { 

    n->elements.push_back(e); 
    return make_pair(*n, true); 
} 

,它一直給錯誤是:

error: expected a type, got 'btree::node' 
error: invalid type in declaration before ';' token 
At global scope: 
error: type/value mismatch at argument 1 in template parameter list for 'template<class _T1, class _T2> struct std::pair' 
error: expected a type, got 'btree::node' 

這似乎就行了發生的事情:

pair <btree<T>::node, bool> btree<T>::addElement (const T& e, btree<T>::node*& n) { 

我在頭上調用它的方式,我不明白爲什麼它說我沒有給它正確的類型。誰可以給我解釋一下這個?

+1

你的構造也不例外安全。你應該避免說'new',或者如果你在構造函數中不止一次說'new',就要非常小心。 –

+0

@KerrekSB你能解釋一下你的意思嗎? – SNpn

+0

想象一下,如果第二個'new'表達式(對於'root-> lvl')拋出一個異常會發生什麼......讓我知道你是否想要一些建議。 –

回答

5

你不得不說:

pair <typename btree<T>::node, bool> 
     ^^^^^^^^ 

這是因爲在模板設置,btree<T>是沒有得到解決,btree<T>::node從屬名稱,你需要消除歧義。

+0

請參閱http://womble.decadent.org.uk/c++/template-faq.html示例,特別是「什麼是相關名稱?」一節。另見http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-template-and-typename-on-dependent-names –

+0

沒錯。不過,這很直觀:只要你不知道什麼是什麼(在這種情況下是'btree '),所有嵌套名稱都是相關的,並且必須是合格的。考慮到'btree '也可能是專業化的可能性總是好的。 –

3

這是一個非常常見的錯誤。

使用typename爲:

pair<typename btree<T>::node, bool> 
    ^^^^^^^^ 

這是因爲node是一個依賴型的,因爲它取決於的模板參數T

3

您需要使用typename告訴從屬名稱定義類型編譯:

template <typename T> 
pair <typename btree<T>::node, bool> btree<T>::addElement (const T& e, typename btree<T>::node*& n) 
相關問題