如何将处理当前类的外部类方法设为友元(不完整类型问题)
C++友元函数声明顺序导致的类型不完整问题解决
问题重现
想让other类的handle_message方法访问message类的私有成员,于是在message里声明该方法为友元,但编译始终报类型不完整错误,代码如下:
#include <cstdio> struct other; class message { friend auto other::handle_message(message) -> void; int private_ = 10; }; struct other { auto handle_message(message msg) -> void { printf("Private part of msg is %d!\n", msg.private_); } }; int main() {}
错误原因
在message类中声明友元函数other::handle_message时,other仅仅是前向声明,编译器只知道other是一个结构体类型,但无法得知它的成员函数信息,因此无法确认other::handle_message的存在,触发类型不完整错误。
解决方法
方案一:调整类的声明与定义顺序
先前向声明message,完整定义other类(仅声明成员函数,实现放在message定义之后),再定义message并声明友元,最后实现other的成员函数:
#include <cstdio> // 前向声明message class message; struct other { // 仅声明成员函数,此时message是前向声明,作为函数参数没问题 auto handle_message(message msg) -> void; }; class message { // 此时other已经完整定义,编译器能识别它的成员函数 friend auto other::handle_message(message) -> void; int private_ = 10; }; // 实现other的成员函数,此时message已经完整定义,可以访问私有成员 auto other::handle_message(message msg) -> void { printf("Private part of msg is %d!\n", msg.private_); } int main() {}
方案二:将整个other类声明为message的友元
如果不需要严格限制仅handle_message有权限,直接把整个other类设为message的友元,写法更简洁:
#include <cstdio> struct other; class message { // 声明整个other类为友元 friend struct other; int private_ = 10; }; struct other { auto handle_message(message msg) -> void { printf("Private part of msg is %d!\n", msg.private_); } }; int main() {}
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

