2012-01-20 1 views
1

でネストされたクラスのために合成されない: はなぜ==演算子である私がコンパイルしようとした場合、自動的にC++

class Outer 
{ 
    class Inner 
    { 
     int t; 
    }; 
public: 
    Inner inner_; 
    bool operator ==(Outer rightSide); 
}; 

bool Outer::operator ==(Outer rightSide) 
{ 
    if (inner_ == rightSide.inner_) 
     return true; 
    return false; 
} 

が、私はエラーを取得します

ああ、私は、オペレータが==であることに気づいたことはありません:またはこれはC++

EDITの財産であります合成されることはありませんでした。私はそれが合成されていると確信していました。
Parapura Rajkumarありがとうございます!

+8

'=='自動的なぜ内部クラスは、すべての例外 –

+1

まずだろう...合成されることはありません、それは単に 'inner_を返す必要があります== rightSide.inner_'、第二に、それはその意味があいまいなので、あなたのために合成されません。 – Phonon

+0

コンパイラがあなたに暗黙の演算子を与えると期待したのはなぜですか? Cf。この質問は、http://stackoverflow.com/questions/217911/why-dont-c-compilers-define-operator-and-operator – Useless

答えて

2

比較演算子は暗黙的に生成されることはありません。唯一のこれらのものは以下のとおりです。演算子

  • デフォルトのコンストラクタ、
  • デストラクタ、
  • コピーや移動コンストラクタ、
  • コピーassigmentと割り当て移動あなたができるようにしたい場合は

あなたの型を比較す​​るには、あなた自身の比較演算子を書く必要があります。それらをメンバーとして実装する場合は、constと宣言する必要があります。それ以外の場合、定数オブジェクトを比較することは不可能です。不要なコピーを避けるために引数を定数参照として使用することも考えられます。このような単純な型ではほとんど違いはありませんが、大規模で複雑なクラスではより効率的です。以下のような何か:

bool Outer::operator==(Outer const & rhs) const { 
    return inner_.t == rhs.inner_.t; 
} 

または非メンバ関数として:

bool operator==(Outer const & lhs, Outer const & rhs) { 
    return lhs.inner_.t == rhs.inner_.t; 
} 
+1

とデストラクタ。 –

+0

@phresnel:ありがとう、忘れました。 –

+0

@phresndlデストラクタは常に生成されます – codekiddy

1

あなたはclass Innerためoperator==を定義していませんでした。だからあなたのコードは次のようになります。

class Outer 
{ 
    class Inner 
    { 
     int t; 
    public: 
     bool operator == (Inner inner) 
     { 
      return t == inner.t; 
     } 
    }; 
public: 
    Inner inner_; 
    bool operator == (Outer rightSide); 
}; 

bool Outer::operator == (Outer rightSide) 
{ 
    return inner_ == rightSide.inner_; 
} 
+0

ありがとうございました!できます。 –

+0

実際、これは**演算子の見た目ではなく、どのように見えるかです**!どのようにあなたがそれらを非メンバにして、おそらく 'const&'パラメータを取るようにしたいのかを知るには。前者は対称変換をサポートし、後者は性能のために、 'const'左辺引数に適用可能です。 –

関連する問題