如何在模板 class 中制作模板 class

How can I make a template class within a template class

我正在努力重新创建正向链表 class 以便更好地理解指针。我遇到了障碍,我有一个名为 forward_list 的模板 class。在私有部分的这个 class 中,我有另一个 class,我希望它具有与主要(外部)class 相同的类型,这个 class 称为节点。

#ifndef FORWARD_LIST_HPP
#define FORWARD_LIST_HPP

template <class T>
class forward_list
{
    private:
        class node
        {
            T data;
            node<T>* next;
        };
        node<T>* head, tail;
    public:
        forward_list();
        ~forward_list();
        void pushBack(T t);
        void print();
};

#endif

当我用我的其余代码编译上面的代码时,我产生了这个错误:

./forward_list.hpp:11:19: error: non-template type ‘node’ used as a template
   11 |             node<T>* next;
      |  

这个我也试过了(我会在我添加的行上加一个'*'。)

#ifndef FORWARD_LIST_HPP
#define FORWARD_LIST_HPP

template <class T>
class forward_list
{
    private:
        template <class T>   // *
        class node
        {
            T data;
            node<T>* next;
        };
        node<T>* head, tail;
    public:
        forward_list();
        ~forward_list();
        void pushBack(T t);
        void print();
};

#endif

这是此更改产生的错误:

./forward_list.hpp:8:19: error: declaration of template parameter ‘T’ shadows template parameter
    8 |         template <class T>
      | 

在第一种情况下,节点是 forward_list<T>::node,或者只是 node 在列表中。没有node<T>.

在第二种情况下,问题是您有两个模板都命名为 T,而您可能想要两个不同的模板。

所以给他们起不同的名字。 :-)

template <class T>
class forward_list
{
        template <class U> 
        class node
        {
        };
};

你的第一个例子非常接近你想要的。需要注意的是,虽然 forward_list 是一个 class 模板,但 forward_list<T> 是一个 class,而 forward_list<T>::node 也是一个 class,而不是class 模板。而且 forward_list<int>::node 是完全独立于 forward_list<double>::node 的 class,即使它们都被称为 node.

因此,以下方法可行:

template <class T>
class forward_list
{
    private:
        class node
        {
            T data;
            node* next; // Just node*, not node<T>*
        };
        node* head, tail; // Just node*, not node<T>*
    public:
        forward_list();
        ~forward_list();
        void pushBack(T t);
        void print();
};

这样 forward_list<int> 将有一个嵌套的 class forward_list<int>::node 和一个 int data; 成员变量,而 forward_list<double> 将有一个嵌套的 class forward_list<double>::node 带有一个 double data; 成员变量。