0

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());
};
4

1 に答える 1

6
Complex Complex::operator+(Complex& num){
    return Complex(Re + num.fRe(), Im + num.fIm());
};

戻り呼び出しで、lvalue-reference にバインドできない一時オブジェクトの c-tor をコピーします。使用する

Complex(const Complex& c);

そしてoperator +使用のためにも

Complex operator + (const Complex& c)

また

Complex operator + (Complex c)

最初のケースの関数fRefImは、定数関数にするか、渡されたオブジェクトの明示的なコピーを行う必要があります。

これは MSVC でコンパイルできますが、g++ ではコンパイルできません。これは、 MSVC がReturn Value Optimizationを実行するときに、受け入れ可能なコピー コンストラクターの存在を誤ってチェックしないためです。

于 2012-08-17T06:57:18.123 に答える