C++报错declaration is incompatible 函数声明定义不兼容问题求助
问题原因
subPlayerNode.h中类定义结束的右大括号后多余书写了subPlayerNode,相当于在mivni命名空间下定义了一个和类名完全同名的对象,引发名字冲突,编译器后续解析函数参数中的类型时会出现识别错误,导致函数签名不匹配。- C++标准规定,在类内部声明的友元函数如果没有提前在当前命名空间中声明,仅能通过实参依赖查找找到,直接在命名空间下定义该函数时,编译器会认为两个函数签名不匹配,触发兼容性错误。
解决方法
- 删掉
subPlayerNode.h类定义末尾多余的subPlayerNode变量声明,将类结尾改为标准的}; - 在
subPlayerNode.h的mivni命名空间内、subPlayerNode类定义之前,提前声明所有用到的友元函数
修改后的subPlayerNode.h参考代码:
#ifndef SUB_PLAYER_NODE_H #define SUB_PLAYER_NODE_H #include "genericNode.h" namespace mivni { // 提前声明所有友元函数 void inOrderChangePlayers(genericNode* root, genericNode* group); void inOrderInsert(subPlayerNode* root, int* index, int** players); subPlayerNode* SubPlayerSortedArrayToBST(int arr[], int start, int end, genericNode* root_players); class subPlayerNode: public genericNode { int level; genericNode* pointer_player; public: subPlayerNode(int key); ~subPlayerNode()=default; friend class playersManager; friend void inOrderInsert(subPlayerNode* root, int* index, int** players); friend void inOrderChangePlayers(genericNode* root, genericNode* group); friend subPlayerNode* SubPlayerSortedArrayToBST(int arr[], int start, int end, genericNode* root_players); }; } #endif
SubPlayerNode.cpp无需修改,重新编译即可解决错误。
内容的提问来源于stack exchange,提问作者Tamar
相关产品推荐
相关产品推荐

