2011-10-14 18 views
0

次のコードシーケンスがあります。コンパイルエラー(コードの下にあります)がわかりません。事前にコンパイルの問題等価/不等式演算子

おかげで、

イウリアン

class X { 
public: 

    int a; 

    X() 
    { 
     a = 0; 
    } 

    bool operator == (const X&r) 
    { 
     return a == r.a; 
    } 

    bool operator != (const X&r) 
    { 
     return !(*this == r); 
    } 
}; 

class DX : public X 
{ 
public: 
    int dx; 
    DX() 
    { 
     dx = 1; 
    } 

    bool operator == (const DX&r) 
    { 

     if(dx != r.dx) return false; 
     const X * lhs = this; 
     const X * rhs = &r; 

     if (*lhs != *rhs) return false; 

     return true; 
    } 

    bool operator != (const DX&r) 
    { 
     return !(*this == r); 
    } 
}; 

int main(void) 
{ 
    DX d1; 
    DX d2; 
    d1 == d2; 
    return 0; 
} 

エラー:

d:\Projects\cpptests>cl opequal.cpp Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 15.00.30729.01 for 80x86 Copyright (C) Microsoft Corporation. All rights reserved.

opequal.cpp opequal.cpp(38) : error C2678: binary '!=' : no operator found which takes a lef t-hand operand of type 'const X' (or there is no acceptable conversion) opequal.cpp(16): could be 'bool X::operator !=(const X &)' while trying to match the argument list '(const X, const X)'

+0

'=='と '=='の形で '!='と '!='を定義しようとしていますが、 '=='の中に '!=まだ定義されていません。すべての演算子を 'const'にする必要があります。 –

+0

警告:等価演算子を空き関数として宣言することをお勧めします。 '(X(1)== DX())<==>(DX()== X(1))'はこのように保証するのは難しいです。 – xtofl

答えて

4

あなたはconstのようあなたのoperator==operator!=関数を宣言する必要があります。

例:

bool operator == (const X&r) const 
+0

ありがとうございます。私は今朝起きなかったようだ... ...( – INS

1

あなたの演算子関数の宣言は、メンバ関数の終わりにのconstを配置し、この

bool operator == (const X&r) const 

ようになっているはずなメンバーが宣言されていない限り(関数は、クラスの任意のメンバーを変更しないことを約束mutable )。このキーワードが不足している関数はすべてミューテータとみなされ、コンパイラはそれらをクラスのconstインスタンスで呼び出すことはできません。

constを指定した場合と指定しない場合とで同じ引数を使用して関数をオーバーロードすることができます。この場合、constバージョンはクラスのconstインスタンスに対してのみ呼び出されます。たとえば、STLコンテナは演算子[]をオーバーロードして、単純参照ではなくconst参照を返します。

+0

詳細をありがとう、私は本当に荒い朝を経験していると思う。 – INS

関連する問題