我试图添加一个嵌套的结构(Node),它采用相同的模板参数' T'传递到基类(LinkedList)。
当我尝试模板化外部LinkedList类时,我得到了非模板类LinkedList"的显式特化。错误。如果我不添加它,私人节点" head"和"尾巴"不承认'
当我将模板添加到Node类时,我得到了一个" T' T'阴影模板参数"错误。但是,如果我没有明确地将它添加到Node类,那么' T'在结构中根本不被识别。
如何声明模板并将其从LinkedList类正确传递给嵌套的私有Node结构?
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);
};
答案 0 :(得分: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。
祝你好运。
答案 1 :(得分: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();