私は C++ を学んでおり、2 つの単純な hello-world アプリケーションを作成しました。どちらも演算子のオーバーロードを使用していますが、ここに問題があります。最初の例では、オーバーロード演算子に 2 つの引数を指定できますが、問題ありません。
ヘッダ:
enum Element {a,b,c,d,e};
Element operator + (Element x, Element y);
//more overloads for -, *, / here
ソース:
Element operator + (Element x, Element y) {
return ArrayOfElements[x][y];
}
しかし、私の 2 番目のアプリ (単純な複素数計算機) では、この方法は機能しませんでした。グーグルで理由を突き止めた後、私は次のコードにたどり着きました:
ヘッダ:
struct Complex {
double Re;
double Im;
Complex (double R, double I) : Re(R), Im(I) { }
Complex operator + (Complex &Number);
//more overloads
};
ソース:
Complex Complex::operator + (Complex &Number)
{
Complex tmp = Complex(0, 0);
tmp.Re = Re + Number.Re;
tmp.Im = Im + Number.Im;
return tmp;
}
現在は機能していますが、最初のコードではoperator
オーバーロードに 2 つの引数を入れることができたのに、2 番目のコードでは次のエラーが発生したのはなぜですか?
complex.cpp:5:51: error: 'Complex Complex::operator+(Complex, Complex)' must take either zero or one argument
クラスを使っても使わなくても同じです。私は多くのドキュメントを探してきましたが、2 番目の方法の方が正しいようです。たぶん、引数の型が異なるためでしょうか?
-Wall -pedantic
を使用してパラメータでコンパイルされた両方のソースはg++
、両方とも同じライブラリを使用しています。