You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++重载Complex类+=运算符报x86_64架构未定义符号错误如何解决?

错误原因
  1. inline修饰符使用错误
    你在complex.cpp中为operator+=添加了inline修饰,C++标准要求inline函数的定义必须在所有调用它的翻译单元中可见。当前你把inline函数的定义放在单独的cpp文件中,main.cpp仅包含了头文件,只能看到函数声明看不到实现,因此链接阶段无法找到对应的函数符号,触发undefined reference错误。
    另外你的operator+=实现存在逻辑错误:this->im += res.re应该修改为this->im += res.im,否则虚部计算结果会出错。
  2. 编译命令参数使用错误(非本次错误直接诱因,但属于写法错误)
    -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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 19:54:05