运算符重载:正常 MSVS,但在 g++ 中失败

overload of operator: ok MSVS but fails in g++

本文关键字:但在 g++ 失败 MSVS 重载 正常 运算符      更新时间:2023-10-16

我有代码在Visual Studio 2010中编译没有错误。但是 g++ 放了错误

CComplex.cpp: In member function 'Complex Complex::operator+(Complex&)':
CComplex.cpp:22: error: no matching function for call to 'Complex::Complex(Complex)'
CComplex.cpp:15: note: candidates are: Complex::Complex(Complex&)
make: *** [CComplex.o] Error 1

请告诉我我的代码有什么问题。

复杂.h

class Complex
{
public:
  Complex();
  Complex(double _Re, double _Im);
  Complex(Complex& c);
  Complex operator+(Complex& num);
  inline double& fRe(void){return Re;}
  inline double& fIm(void){return Im;}
protected:
  double Re;
  double Im;
}

复杂.cpp

Complex::Complex(){
    Re = 0.0;
    Im = 0.0;
}
Complex::Complex(double re, double im){
    Re = re;
    Im = im;
}
Complex::Complex(Complex& complex){
    *this = complex;
}
Complex Complex::operator+(Complex& num){
    return Complex(Re + num.fRe(), Im + num.fIm());
};
Complex Complex::operator+(Complex& num){
    return Complex(Re + num.fRe(), Im + num.fIm());
};

在返回调用中,临时对象的复制 c-tor,它不能绑定到左值引用。用

Complex(const Complex& c);

也供operator +使用

Complex operator + (const Complex& c)

Complex operator + (Complex c)

对于第一种情况,函数fRefIm应该是常量函数,或者你应该对传递的对象进行显式复制。

它可以在 MSVC 中编译,而不是用 g++ 编译,因为在执行返回值优化时,MSVC 错误地不检查是否存在可接受的复制构造函数。

相关文章: