C++ Tree类编译报unknown type name 'Node'错误怎么解决?
错误原因
你遇到的编译错误是C类内的名称查找顺序规则导致的:C编译器解析类定义时是从上到下逐行处理的,你的Node结构体定义放在了类的private段末尾,在这之前的public段成员函数声明已经用到了Node类型,此时编译器还没有扫描到Node的定义,无法识别该类型,因此抛出未知类型名的错误。同类的其他报错也都是因为公共成员函数用到了还未声明的Node类型。
你收到的典型报错信息如下:
./Tree.h:14:2: error: unknown type name 'Node'
Node *getParent(Node *child);
修复方案
有两种常用的修复方式,可根据你的代码风格需求选择:
方案1:调整Node定义位置
直接将Node结构体的定义挪到类内所有使用Node的代码之前,该方式修改量最少,无需额外声明:
#ifndef TREE_H_ #define TREE_H_ class Tree { // 先定义Node结构体,再声明用到Node的成员函数 private: struct Node { Node *parent; Node *left; Node *right; int value; }; public: Tree(int arr []); Node *getParent(Node *child); Node *getRightChild(Node *parent); Node *getLeftChild(Node *parent); private: Node *root; int size; }; #endif
方案2:类内前置声明Node
如果你希望保持public段在前的代码排序风格,可以在类的最开头先对Node做前置声明,告知编译器该类型后续会定义:
#ifndef TREE_H_ #define TREE_H_ class Tree { // 前置声明Node类型 private: struct Node; public: Tree(int arr []); Node *getParent(Node *child); Node *getRightChild(Node *parent); Node *getLeftChild(Node *parent); private: struct Node { Node *parent; Node *left; Node *right; int value; }; Node *root; int size; }; #endif
两种方案都可以解决编译错误,如果你不需要对外暴露Node类型,两种实现的访问控制效果完全一致。
内容的提问来源于stack exchange,提问作者boogiewoogie
相关产品推荐
相关产品推荐

