我正在尝试创建一个新的Node cpp / h文件,但是我收到以下错误:
字段'指针'具有不完整类型'节点'
标题文件
#ifndef NODE_HEADER
#define NODE_HEADER
template <class T>
class Node {
private:
T value;
Node<T> pointer; //The problem seems to be here
public:
Node<T>();
Node<T>(T value);
Node<T>(T value, Node<T> pointer);
T get_value();
void set_value(T value);
Node<T> get_pointer();
void set_pointer(Node<T> pointer);
};
#endif
答案 0 :(得分:7)
Node<T>
不能包含其他Node<T>
。
使递归工作需要无限的记忆。
您可能打算存储Node<T>*
,尤其是当该成员被称为pointer
时......
C ++不是Java。
答案 1 :(得分:3)
你的课程必须归结为
struct Foo
{
int a;
Foo b;
};
这个问题是为了让编译器创建Foo
的实例,它需要知道所有成员的大小。我们知道int
的大小是多少,但Foo
的大小是多少?嗯,它是所有成员的大小。由于Foo
具有Foo
类型的成员,因此您现在具有递归定义。您的大小为a
加上b
的大小,其中b
的大小为a
的大小加上b
的大小,并且会继续永远。
要解决此问题,我们可以使用指针或引用。编译器知道指针或引用的大小。所以如果我们使用指针
struct Foo
{
int a;
Foo* b;
};
现在,Foo
的大小变为int
的大小加上pointer
的大小。指针指向的并不重要,因为所有指针的大小都相同。
因此,对于您的案例pointer
应该声明为
Node<T>* pointer;
您可能还需要更改构造函数,set_pointer
也可以通过指针获取Node
。