2015-05-17 292 views
2

我試圖寫一個C++ 11鏈表的實現,用鏈表是一個模板類和它的節點是一個嵌套類,如下所示:類模板聲明C++嵌套類

template <typename T> 
class LinkedList { 
public: 
    class Node; 
    std::shared_ptr<Node> listSearch(const T &input) const; 

private: 
    std::shared_ptr<Node> head; 
    std::shared_ptr<Node> tail; 
}; 

template <typename T> 
class LinkedList<T>::Node { 
private: 
    T data; 
    std::shared_ptr<Node> next; 
} 

我假設類Node本身不是一個模板,但是當LinkedList被實例化時,它也會創建Node類。

當我嘗試按以下方式定義listSearch函數時,出現錯誤:「模板類型參數的模板參數必須是類型;您是否忘記了'typename'?」。有人可以解釋什麼是錯的?

template <typename T> 
std::shared_ptr<LinkedList<T>::Node> LinkedList<T>::listSearch(const T &input) { ... } 

編輯:

好了,我重新編譯gcc和錯誤信息是清晰的。它需要以下內容:

std::shared_ptr<typename LinkedList<T>::Node> LinkedList<T>::listSearch(const T &input) const { ... } 

爲什麼在LinkedList :: Node之前需要typename?這不是一個明顯的類型?

+0

忘了'模板'? –

+0

對不起,我的錯。模板存在,只是忘了添加它的問題。編輯OP。 – JamesLens

+0

我在我的答案中放了一個鏈接。 –

回答

3

here

template <typename T> 
std::shared_ptr<typename LinkedList<T>::Node> LinkedList<T>::listSearch(const T &input) { ... } 
+0

啊C++你很複雜。謝謝,這回答了我的問題。 – JamesLens

+0

https://isocpp.org/wiki/faq/templates#nondependent-name-lookup-types另一個有興趣的人的答案。 – JamesLens