C++重载Complex类+=运算符报x86_64架构未定义符号错误如何解决?
错误原因
- inline修饰符使用错误
你在complex.cpp中为operator+=添加了inline修饰,C++标准要求inline函数的定义必须在所有调用它的翻译单元中可见。当前你把inline函数的定义放在单独的cpp文件中,main.cpp仅包含了头文件,只能看到函数声明看不到实现,因此链接阶段无法找到对应的函数符号,触发undefined reference错误。
另外你的operator+=实现存在逻辑错误:this->im += res.re应该修改为this->im += res.im,否则虚部计算结果会出错。 - 编译命令参数使用错误(非本次错误直接诱因,但属于写法错误)
-I参数的作用是指定头文件的搜索目录,你直接传入头文件complex.hpp属于参数误用,正确的写法应该是传入目录路径,比如当前目录可以写-I .,由于你的头文件和源码在同级目录,不写该参数也能正常找到头文件。
修复方案
方案1:保留实现到cpp文件
修改complex.cpp代码,删除operator+=前的inline修饰,同时修正逻辑错误:
#include "complex.hpp" Complex& Complex::operator+=(const Complex& res) { this->re += res.re; this->im += res.im; return *this; }
修改编译命令,删除错误的-I complex.hpp参数:
g++ main.cpp complex.cpp -o out
方案2:保留inline属性
如果你希望该运算符函数是inline的,直接将实现移到complex.hpp的类定义中即可:
#ifndef __COMPLEX__ #define __COMPLEX__ class Complex { public: Complex(double x=0, double y=0):re(x), im(y){}; double real() const {return re;} double imag() const {return im;} Complex& operator+=(const Complex& res) { re += res.re; im += res.im; return *this; } private: double re,im; }; #endif
此时可以删除complex.cpp中的operator+=实现,编译命令同上即可。
内容的提问来源于stack exchange,提问作者nick zhang
相关产品推荐
相关产品推荐

