0

我是编程和 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是一个类,但可以是任何其他类)。

4

2 回答 2

5

试试这个:

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

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

另一个建议:避免在标准 C++ 库中的类型之后命名您的自定义类型(例如list, vector, queue... 它们都在 namespace 中std)。它令人困惑,并且可能导致名称冲突(除非您将其放置在您自己的命名空间中,您需要在放置的任何地方明确使用该命名空间using namespace std;)。

于 2012-05-29T15:50:35.587 回答
2

不要试图通过反复试验和猜测语法来学习 C++,读一本好书

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;

这试图声明一个 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;

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

于 2012-05-29T16:17:31.467 回答