2014-08-31 67 views
1

我試圖添加一個嵌套的結構(Node),該結構採用傳入基類(LinkedList)的相同模板參數'T'。將模板參數傳遞給嵌套結構

當我嘗試模板外部LinkedList類時,我得到了「非模板類LinkedList的顯式特化」錯誤。如果我不添加它,私人節點「頭」和「尾巴」不識別「T」

當我將模板添加到節點類,我得到一個「聲明T'陰影模板參數「錯誤。但是,如果我沒有明確地將它添加到Node類中,那麼在結構中根本不會識別'T'。

如何聲明模板並將其正確地從LinkedList類傳遞給嵌套的專用節點結構?

template<class T> 
class LinkedList<T> { 

private: 
    template<typename T> 
    struct Node { 
     T value; 
     Node<T>* next; 
     Node<T>* previous; 
     Node<T>(T value, Node<T>* next, Node<T>* previous) 
     :value(value), 
     next(next), 
     previous(previous){} 
     Node<T>& operator=(const Node<T>&) = delete; 
    }; 

    Node<T>* head; 
    Node<T>* tail; 

    LinkedList& operator=(const LinkedList&) = delete; 

public: 
    LinkedList<T>() 
     :head(nullptr), 
     tail(nullptr){} 
    ~LinkedList<T>(); 
    LinkedList& insertTail(T value); 

}; 
+1

'節點'不一定是模板。你可以(也應該)只使用'LinkedList'中的'T'(在名字後面不應該有'')。 – WhozCraig 2014-08-31 07:00:16

回答

2

當聲明一個主模板(即,不是一個專門化),不添加<T>名稱後:

template<class T> 
class LinkedList { 

Node不應該是一個模板;對於任何特定T,一個LinkedList<T>應該只有一個類型的Node秒 - 那些持有T

struct Node { 
    T value; 
    Node* next; 
    // ... 
}; 

最後,當你在它的定義寫模板的名稱<T>是隱含的,所以你不需要顯式指定它:

LinkedList() 
    :head(nullptr), 
    tail(nullptr){} 
~LinkedList(); 
3

失去所有的外來<T>瘋狂,只是使用外模板參數。這是完全合法的,這樣做的:

template<class T> 
class LinkedList 
{ 
private: 
    struct Node { 
     T value; 
     Node* next; 
     Node* previous; 

     Node(T value, Node* next, Node* previous) 
      : value(value), next(next), previous(previous) 
     {} 
     Node& operator=(const Node&) = delete; 
    }; 

    Node* head; 
    Node* tail; 

    LinkedList& operator=(const LinkedList&) = delete; 

public: 
    LinkedList() 
     : head(nullptr) 
     , tail(nullptr) 
    {} 
    ~LinkedList(); 

    LinkedList& insertTail(T value); 
}; 

相關:我的水晶球告訴我you should read this實施的是僅此聲明的其餘功能之前。

祝你好運。

+0

感謝您的鏈接到其他問題/答案,這真的很有幫助! – user3478252 2014-08-31 16:05:02