【问题标题】:overload of operator: ok MSVS but fails in g++运算符重载:好的 MSVS 但在 g++ 中失败
【发布时间】:2012-08-17 06:51:52
【问题描述】:

我的代码在 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());
};

【问题讨论】:

    标签: c++ operator-overloading


    【解决方案1】:
    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 wrongly does not check for an existence of acceptable copy constructor在执行Return Value Optimization时。

    【讨论】:

      猜你喜欢
      • 2021-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      相关资源
      最近更新 更多