我是编程和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
是一个类,但可以是任何其他类)。
答案 0 :(得分:5)
试试这个:
template <typename TElement>
struct node{
TElement data;
node* next;
};
node<int>* ptr[max], *root[max], *temp[max];
另外一个建议:避免在标准C ++库中的类型之后命名自定义类型(例如list
,vector
,queue
...这些类型都在命名空间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;
另外,你确定你想要指针数组吗?既然你显然不知道你在做什么,那么使用为你工作的标准容器类型会更明智。