繁体   English   中英

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

[英]Passing template parameters to nested structs

我正在尝试添加一个嵌套结构(节点),该结构采用传递给基类(LinkedList)的相同模板参数“ T”。

当我尝试对外部LinkedList类进行模板化时,出现“非模板类LinkedList的显式专业化”错误。 如果不添加,私有节点“ head”和“ tail”将无法识别“ T”

将模板添加到Node类时,出现“ 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);

};

失去所有多余的<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);
};

相关:我的水晶球告诉我在实现仅在此处声明的其余功能之前, 您应该阅读此内容

祝你好运。

在声明主模板(即非专业化)时,请勿在名称后添加<T>

template<class T>
class LinkedList {

Node不应该是模板; 对于任何特定的TLinkedList<T>应该只具有一种Node s-那些持有TNode

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

最后,当您在模板定义中写入模板名称时,就暗示了<T> ,因此您无需显式指定它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM