字段“指针”具有不完整类型“节点”

时间:2016-05-09 17:33:53

标签: c++ header-files

我正在尝试创建一个新的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

2 个答案:

答案 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