2014-08-31 69 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