2012-11-26 100 views
4

我目前正試圖在列表模板類中使用列表類的私有節點結構實現排序算法。我使用了一些私有的遞歸函數,它返回一個指向節點類型的指針,導致g ++給我一個聲明錯誤。這是我有什麼樣 -聲明模板類中的結構,未定義成員函數

template<class T> 
class SList 
{ 
private: 
    struct NODE 
    { 
     T* elem; 
     NODE* next; 
    } *_head, *_tail; 

NODE* sort(NODE* node); 

public: 
    //other declarations... 

} 

template<class T> 
NODE* SList<T>::sort(NODE* node) //Error: 'NODE' does not name a type 
{ 
    //sorting algorithm 
} 

這是c + +的限制還是我錯過了什麼?

回答

10

由於Node是你需要告訴編譯器在哪裏Node的定義來自一個內部類。

此外,節點的定義取決於SList的模板參數是什麼樣的變化(這是一個依賴型

所以,你必須明確地提及Node這樣:

template<class T> 
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node) 
{ 
    //sorting algorithm 
} 
  • 注意typename,因爲節點是從屬類型(它取決於SList的類型)
  • 注意SList<T>::Node,因爲節點是類型從屬SList的類型。
1

要參考是內SLIST的類型,所以你必須把它稱爲這樣的:

template<class T> 
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node); 
+0

您需要添加'typename'因爲'Node'是一個依賴類型 –

+0

正確,好點。我會補充一點。 – Agentlien

+0

啊謝謝!我也遇到了一個錯誤,我在模板聲明後添加了typename。 編輯:打敗我吧 – Lindenk

2

以下工作正常:

template<class T> 
typename SList<T>::NODE* SList<T>::sort(typename SList<T>::NODE* node) 
^^^^^^^^^^^^^^^^^^^      ^^^^^^^^^^^^^^^^^^^ 

是C的這個限制++

沒有。因爲SList<>的範圍之外可以有任何名爲NODE的結構/類型;所以實際上它是一個工廠,C++爲您提供了可以在不同範圍內具有相同名稱類型的工具。

「爲什麼我需要關鍵字typename」可以找到here

相關問題