返回枚举类型的C函数作为C++类友元编译失败的解决方法
问题解决方法
报错原因
你的代码编译报错是因为C++编译器对友元声明的语法解析出现了歧义:
- 当你写
friend c_style_enum_t ::c_func();时,编译器会错误地将c_style_enum_t ::解析为尝试访问枚举类型c_style_enum_t的作用域,但枚举类型并非类或命名空间,因此触发第一个错误。 - 由于解析失败,编译器无法识别
c_func的返回类型,进而触发第二个“无类型声明”的错误。
而返回类型为int时能正常编译,是因为int是内置基本类型,编译器不会将int ::误判为作用域访问,能正确解析为“返回类型为int的全局函数c_func”。
解决方案
你可以通过以下两种方式修正友元声明的语法:
方案1:直接引用全局作用域的函数
由于c_func已经通过extern "C"块声明为全局作用域的函数,你只需在友元声明中明确指定全局作用域即可,无需重复写返回类型:
class my_class { public: private: friend ::c_func(); };
方案2:完整声明函数签名
如果你希望明确写出返回类型,直接按照函数的完整签名声明友元即可(无需额外加作用域解析符,因为编译器会自动查找全局作用域的匹配函数):
class my_class { public: private: friend c_style_enum_t c_func(); };
两种方案都能让编译器正确识别c_func的身份,解决编译报错问题。
内容的提问来源于stack exchange,提问作者Xeenych Xeenych
相关产品推荐
相关产品推荐

