为何无法在同一行定义两个同类型的类成员指针?
为什么在同一行定义两个同类型类成员指针会触发"Incomplete Type"错误?
首先得戳破这个误区:你写的Node* prev, next;根本没声明两个指针!这是C++(和C)里一个超级容易踩的坑——指针符号*是绑定到单个变量名的,不是类型的一部分。
咱们拆解你的代码看看问题出在哪:
class Node { public: Node(int k, int v) { key = k; val = v; } public: Node* prev, next; // 这里的next是Node类型的对象,不是指针! int key, val; };
这行声明其实等价于:
Node* prev; Node next;
问题就出在Node next;上——此时Node类还没定义完(咱们正处在类的定义内部),属于不完全类型,C++不允许用不完全类型直接声明对象(因为编译器不知道它的大小,没法分配内存),所以就报了field 'next' has incomplete type 'Node'的错误。
那为什么改成分行声明就没问题?
如果你写成:
Node* prev; Node* next;
这时候两个都是指针,而C++允许用不完全类型声明指针(因为指针的大小是固定的,不管指向的类型是什么,编译器都知道怎么分配内存),所以就不会报错。
至于改成int prev, next;没问题就更简单了:int是完全类型,不管怎么声明都不会有不完全类型的问题。
最后给你提个醒:
- 声明多个指针的时候,每个变量名前面都要加
*,别偷懒只在类型后面写一次 - 类内部声明自己类型的成员时,只能声明指针/引用,不能直接声明对象,因为类还没定义完成,属于不完全类型
内容的提问来源于stack exchange,提问作者Jerry
相关产品推荐
相关产品推荐

