在结构上使用模板时遇到问题

时间:2012-05-29 15:48:03

标签: c++ templates struct

我是编程和C ++的初学者。我之前使用过模板,但是方式非常有限,我不知道我做错了什么:

template <typename TElement>
struct list{    // if I try list<TElement> => list is not a template
    TElement data;
    struct list *next;
} node_type;    // also tried node_type<TElement>, other incomprehensible errors
node_type *ptr[max], *root[max], *temp[max];

我发现错误有点难以理解:"node_type does not name a type"
我做错了什么?

我打算做什么:
我想要一个类型列表(所以我可以在几个完全不同的抽象数据类型 - ADT上使用它),所以我想最终得到这样的东西:

Activities list *ptr[max], *root[max], *temp[max]

如果这有意义(其中Activities是一个类,但可以是任何其他类)。

2 个答案:

答案 0 :(得分:5)

试试这个:

template <typename TElement>
struct node{   
    TElement data;
    node* next;
};    

node<int>* ptr[max], *root[max], *temp[max];

另外一个建议:避免在标准C ++库中的类型之后命名自定义类型(例如listvectorqueue ...这些类型都在命名空间std中)。这是令人困惑的,并且可能导致名称冲突(除非您将它放在您自己的命名空间中,无论您将using namespace std;放在哪里,都需要明确地使用它。)

答案 1 :(得分:2)

不要试图通过反复试验来学习C ++并猜测语法,请阅读good book

template <typename TElement>
  struct list{

这声明了一个名为list的结构模板,它有一个模板参数TElement,它用作实例化模板类型的别名(仅在模板的主体内)。

如果您实例化list<int>,则TElement会引用int。 如果您实例化list<char>,那么TElement将引用char。 等

因此,您实例化模板的类型将替换模板定义中的TElement

尝试时遇到的错误:

// if I try list<TElement> => list is not a template
template <typename TElement>
  struct list<TElement> {

是因为这不是有效的语法,错误告诉你list不是模板,因为在你写list<TElement>时你还没有完成声明list ,所以编译器不知道它是什么,如果没有定义列表模板,你就不能有一个列表。

template <typename TElement>
  struct list{
    TElement data;
    struct list *next;
  }node_type;

这会尝试声明list类型的对象,类似于以下语法:

struct A {
  int i;
} a;        // the variable 'a' is an object of type 'A'

但在你的情况下list不是一个类型,它是一个模板。 list<int>是一种类型,但list本身不是有效类型,它只是一个模板,可以在“填充空白”时提供类型,即提供替换类型的类型参数TElement

看起来你甚至都没有尝试声明一个变量,只是盲目地猜测语法。

// also tried node_type<TElement>, other incomprehensible errors

这也无济于事,node_type<TElement>是无意义的,如果你想声明一个需要一个类型的变量,例如list<int>。参数TElement需要替换一个类型,它本身不是一个类型。停止尝试将随机位语法串起来希望它能够正常工作。您可以先阅读http://www.parashift.com/c++-faq/templates.html

在最后一行:

node_type *ptr[max], *root[max], *temp[max];

node_type不是一种类型,因此不起作用。此外,你应该避免养成在一行上声明多个变量的坏习惯。写起来要清楚得多:

int* p1;
int* p2;

而不是

int *p1, *p2;

另外,你确定你想要指针数组吗?既然你显然不知道你在做什么,那么使用为你工作的标准容器类型会更明智。