2009-05-25 8 views
23

std :: mapのキーとしてカスタムタイプを割り当てようとしています。ここで私がキーとして使用しているタイプがあります。 のstd ::マップで使用する場合マップのキーとしてのカスタムタイプ - C++

struct Foo 
{ 
    Foo(std::string s) : foo_value(s){} 

    bool operator<(const Foo& foo1) { return foo_value < foo1.foo_value; } 

    bool operator>(const Foo& foo1) { return foo_value > foo1.foo_value; } 

    std::string foo_value; 
}; 

、私は次のエラーを取得しています。

error C2678: binary '<' : no operator found which takes a left-hand operand of type 'const Foo' (or there is no acceptable conversion) c:\program files\microsoft visual studio 8\vc\include\functional 143 

以下のような構造体を変更すると、すべてが機能します。

struct Foo 
{ 
    Foo(std::string s) : foo_value(s) {} 

    friend bool operator<(const Foo& foo,const Foo& foo1) { return foo.foo_value < foo1.foo_value; } 

    friend bool operator>(const Foo& foo,const Foo& foo1) { return foo.foo_value > foo1.foo_value; } 

    std::string foo_value; 
}; 

何も友人ように、オペレータのオーバーロードを行う以外に変更はありません。なぜ私の最初のコードが動作していないのだろうか?

どのような考えですか?

答えて

32

私はあなたが

bool operator<(const Foo& foo1) const; 

注引数の後constを必要とする疑いがある、これはオブジェクト定数(比較において左側)「あなた」を作ることです。

単一の演算子が必要な理由は、必要な順序付けを実装するだけで十分です。抽象的な質問に答えるためには、 "bの前に来なければならないのですか?" aがbより小さいかどうかを知るだけで十分です。

+0

ありがとうございました。それがトリックでした。 –

+0

もっと詳しく説明できますか?なぜ演算子<と演算子==または演算子>だけが必要ですか? – bobobobo

+14

演算子<と演算子==を演算子<から派生させることができるためです。 '(b b)'を意味するので、演算子>があります。 '(!(a skrebbel

3

これは、おそらくconstメンバー演算子を探しています(正しい名前が何であれ)。それは(質問からコピー/貼り付け)必要に応じていなかったとして、私の答えからoperator>を削除したが、それは、コメント:)

注意を引き付けた:

bool operator<(const Foo& foo1) const { return foo_value < foo1.foo_value;} 

EDIT: これは(ノートのconst)作品私は100%あなたがそれを必要としていることを確かめてください。const私はこの例を編集しました。

+2

あなたは必要ありません> –

+0

面白いstackoverflowは前の答えを10分前に示していますが、私は私の答えを提出するときにはまだありません...したがって、同じ答え – stefanB

+0

定数はconst関数が必要です。 – siddhusingh

0

引数の後にconstがあることに注意してください。これは、 "your"(比較の左側)オブジェクトを定数にすることです。

詳細を教えてください。なぜあなたがメンバをconstにするか(私が知っている限り、オブジェクトの状態を変更できない、つまりprivate変数を変更することなど)は、 "あなた"が左側になることを保証しますか?

0

詳細を教えてください。なぜあなたがメンバをconstにするか(私が知っている限り、オブジェクトの状態を変更できない、つまりprivate変数を変更することなど)は、 "あなた"が左側になることを保証しますか?

私はまだこれについてコメントする担当者を持っていません。

constでは、「あなたの」が左側になることは魔法のようには保証されません。ポスターは、左手側(つまりx xが< y)が比較対象となるオブジェクトであると言っていました。メンバーの変更をオペレータ<の引数でconstを使って変更するのと同じように、メソッドのシグニチャの最後にあるconstを使ってxのメンバを変更から保護したいとします。

関連する問題