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

Passing template parameters to nested structs

本文关键字:嵌套 结构 参数传递      更新时间:2023-10-16

我正在尝试添加一个嵌套结构(Node),该结构采用传递到基类(LinkedList)中的相同模板参数"T"。

当我尝试对外部LinkedList类进行模板化时,我会得到一个"非模板类LinkedList的显式专用化"错误。如果我不添加它,私有节点"头"answers"尾"不会识别"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不应该是一个模板;对于任何特定的T,一个LinkedList<T>应该只有一种类型的Nodes——那些包含T:的

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

最后,当您在模板的定义中写入模板的名称时,<T>是隐含的,因此您不需要显式指定它:

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