不调整类B与类A定义顺序,如何解决A::func未识别的编译报错?
类定义顺序导致的编译器错误解决方案
当你在头文件中按如下顺序定义类B和类A时:
#include <iostream> class B { public: void doSth() { A::func(1); } }; class A { public: static void func(int a) { std::cout<<"a = "<< a <<std::endl; } };
编译器会报错'func' is not a member of 'A'——这是因为编译器处理类B的doSth成员函数实现时,类A的完整定义还未被解析,编译器无法确认A是否包含func这个静态成员。
你可以通过前向声明类A并调整成员函数实现位置的方式解决问题,无需改变类B和类A的定义顺序,具体实现如下:
#include <iostream> // 前向声明类A,告知编译器A是一个类类型 class A; class B { public: // 仅声明函数,将实现移到类外 void doSth(); }; class A { public: static void func(int a) { std::cout<<"a = "<< a <<std::endl; } }; // 在类A完整定义后,实现B的doSth函数 void B::doSth() { A::func(1); }
原理说明
- 前向声明
class A;仅让编译器知道A是一个类,但无法获取其成员信息,因此只能用于类内的函数声明,不能直接在类内实现调用A成员的逻辑。 - 将
B::doSth的实现移到类A的完整定义之后,此时编译器已经能识别A::func的存在,即可正常编译。
内容的提问来源于stack exchange,提问作者Nick X Tsui
相关产品推荐
相关产品推荐

