我正在尝试编写二叉搜索树,但是我的Clion IDE在不同的地方给了我这个错误:Struct TreeNode doesn't have a field 'balance'
。
我选择'balance'作为例子,但这发生在结构中的每个字段。
我的整个头文件如下:
#define CARD_SIZE 15
typedef struct TreeNode *node_ptr;
typedef struct TreeNode{
char card[CARD_SIZE];
int balance;
node_ptr left;
node_ptr right;
node_ptr parent;
}Node;
发生错误的示例是:
bool updateSearch(int balance, char *card) {
node_ptr node = searchNode(card,tree.root);
if(node){
node->balance += balance; //Right here
return true;
}
return false;
}
可能导致此问题的原因是什么?
答案 0 :(得分:1)
根据评论,我们似乎已经诊断出问题,@ joneleam确认该解决方法有效。
这不是编译错误,而是静态分析器的限制。在代码段中,node_ptr
的定义为struct TreeNode*
,位于struct TreeNode
的定义之前。因此,当编译器看到该声明时,它只知道TreeNode
是某种struct
,它甚至可能不必在同一个转换单元中定义。如果它确实立即看到struct TreeNode
的定义,则无法将此node_ptr
的定义统一为struct TreeNode*
。因此,它不知道node_ptr
的{{1}}成员指向哪个成员,即使它指向另一个struct TreeNode
!
解决方法是重构为:
TreeNode
你也可以,技术上来说,#define CARD_SIZE 15
typedef struct TreeNode{
char card[CARD_SIZE];
int balance;
struct TreeNode* left;
struct TreeNode* right;
struct TreeNode* parent;
}Node;
typedef struct TreeNode *node_ptr;
,如果把它写出来,对你来说代码太过分了,但这对我来说更像一个代码味道。除非开发人员添加对您的正确代码的支持,或者有更好的解决方法,否则由您做出的权衡取决于您。