C++使用std::map存成员函数指针出现Undefined symbols链接错误怎么办
问题原因
你遇到的是典型的C++链接阶段符号未找到错误,链接器无法定位Intern类中声明的makeShrub、makeRobot、makePres三个成员函数的实现地址。
最可能的根因
结合你补充的「三个函数和construct_map在同一文件、位置在其上方」的说明,90%以上的概率是你定义这三个成员函数时,遗漏了Intern::类作用域限定符。
比如你当前的错误写法应该是这样的:
// 错误:没有加类作用域,会被编译器识别为独立的全局函数,和类内声明的成员函数无关 Form* makeShrub(std::string target) { // 实现逻辑 } Form* makeRobot(std::string target) { // 实现逻辑 } Form* makePres(std::string target) { // 实现逻辑 }
类的非静态成员函数定义时必须显式指定所属类,正确写法如下:
// 正确:明确指定函数属于Intern类 Form* Intern::makeShrub(std::string target) { // 实现逻辑 } Form* Intern::makeRobot(std::string target) { // 实现逻辑 } Form* Intern::makePres(std::string target) { // 实现逻辑 }
修复方法
检查三个函数的定义,补全Intern::前缀后重新编译即可解决报错。
如果补全后仍然报错,可以再检查是否有以下异常情况:
- 三个函数的签名和类内声明不一致,比如参数类型、返回值类型、const修饰符有差异
- 编译时没有把当前实现文件加入编译目标列表
内容的提问来源于stack exchange,提问作者kubo
相关产品推荐
相关产品推荐

