将模板参数传递给嵌套结构

时间:2014-08-31 06:57:03

标签: c++ templates struct nested

我试图添加一个嵌套的结构(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);

};

2 个答案:

答案 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不应该是模板;对于任何特定的TLinkedList<T>应该只有一种类型的Node - 那些持有T的内容:

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

最后,当您在其定义中编写模板名称时隐含<T>,因此您无需明确指定它:

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