在结构中使用模板 - 制作通用链表

时间:2011-06-10 22:33:44

标签: c++ templates struct linked-list

在.NET中,我非常喜欢System.Generic.List,并希望将其复制为学习C ++语言的一种方式。问题是我希望它是通用的,我希望元素包含模板类型T的值。我知道要做什么,但问题在于节点。

template<class T>
struct node
{
    T value;
    bool isFirst;
    node *next;
};

我试过谷歌搜索一段时间,但没有找到任何相关的东西。我刚刚浏览了www.cplusplus.com上的教程。我是否必须使用指针引用该类,如果是,如何?

提前致谢

Gisle Aune

2 个答案:

答案 0 :(得分:8)

您的代码没有任何问题。实际上,我可能会把它写成

template<class T>
struct node
{
    T value;
    bool isFirst;
    node<T> *next;
};

因为它不够冗长而且next指向相同类型的node更清楚,但是你的版本也很好:在模板中,当你使用的名称时在没有明确指定模板参数的情况下,它暗示它们与当前实例化的模板相同。这可以在C ++标准的§14.6.1中解释:

  

在类模板的范围内,当模板的名称既不合格也不跟&lt;时,它等同于模板的名称,后跟&lt;&gt;中的模板参数。 [示例:Set的构造函数可以称为Set()Set<T>()。 ]其他专业(14.7.3)   可以通过使用适当的模板参数显式限定模板名称来引用该类。 [实施例:

template<class T> class X {
    X* p;      // meaning X<T>
    X<T>* p2;
    X<int>* p3;
};
  

-end example]


顺便说一下,编写通用列表是学习语言的有用练习,但请记住,C ++标准库中已经有许多通用容器可用;除了它们经过彻底的测试和优化之外,它们的“迭代器”抽象允许您在几乎任何容器上使用库中可用的独立算法。

答案 1 :(得分:2)

这段代码写得正确。无论如何,如果你想在c ++中使用通用列表,你可以使用stl

#include <list>
std::list<int> lista;