如何在模板 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;
成员变量。
我正在努力重新创建正向链表 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;
成员变量。