为何类内成员函数的C++友元机制与独立函数表现不同?
两段代码编译差异的原因
第一段可编译的原因
第一段里的createB是全局函数,在B类中声明friend B createB();时,这个声明同时也充当了全局函数的前置声明。后续在A类定义完成后,我们给出了createB的具体实现,编译器能够匹配到之前的友元声明,因此可以正常编译。另外这里的class A;只是前向声明,和全局createB的声明/定义没有冲突,不影响编译流程。
第二段无法编译的核心问题
第二段的问题出在B类中的友元声明friend B A::createB();:
- 此时代码里只有
A的前向声明(class A;),编译器仅知道A是一个类,但完全不清楚A内部有哪些成员函数,无法确认A::createB是否存在。 - C++规定,要引用某个类的成员函数(哪怕是作为友元声明),必须先让编译器看到该类的完整定义,否则无法解析
类名::成员函数的语法。
修正方案
调整类的定义顺序,先完整定义A类,再定义B类,让编译器在处理B的友元声明时,已经知道A::createB的存在:
#include <iostream> class B; // 改为前向声明B class A { public: A() { std::cout << "A"; } B createB(); // 先声明成员函数,后续定义 }; class B { public: B() { std::cout << "B"; } friend B A::createB(); // 此时A已完整定义,编译器能识别这个成员函数 }; // 补充A::createB的实现 B A::createB() { return B(); } int main() { A a; B b = a.createB(); }
内容的提问来源于stack exchange,提问作者user27665
相关产品推荐
相关产品推荐

