2017-01-22 5 views
2

私はユーザー定義型とカスタム比較関数のセットを使用しています。 ==演算子をセット間で使用しようとすると、コンパイル時エラーが発生します。私は何が欠けていますか? カスタム比較関数で等値を設定する

Here you can see the error.

#include <cassert> 
#include <set> 

// my user-defined type 
struct IntWrapper { 
    int value; 
}; 

// my compare function 
struct LessComparer { 
    bool operator()(const IntWrapper& lhs, const IntWrapper& rhs) const { 
     return lhs.value < rhs.value; 
    } 
}; 

int main() { 
    std::set<IntWrapper, LessComparer> s; 
    assert(s == s); // I would expect this to work 
} 

+0

あなたの '演算子=='(と '演算子!=')はどこですか? – Toris

+1

カスタムコンパレータは、比較セットではなく、セット内の要素を比較するためのものです – Loreto

+0

面白いですが[this](http://ideone.com/tn1huh)は動作します。なぜ、コンパイラは 's'が関数だと思うかもしれないのか分かりません。 – ilotXXI

答えて

4

http://en.cppreference.com/w/cpp/container/set/operator_cmp

キーがオーバーロードを使用するために(1-2)でEqualityComparableの要件を満たす必要があります。

http://en.cppreference.com/w/cpp/concept/EqualityComparable

型Tを満たすEqualityComparable a、b、cの考える
場合、型TまたはCONSTの表現T
次の式は有効で、その指定された効果を持っている必要があります:
a == b

だから、あなたがNE IntWrapperタイプの場合はoperator==と定義します。

+0

受け入れられますが、それは意味をなさない私。なぜそれが必要ですか?私はすでに、より小さい比較を定義しています、それから平等を得るのは簡単です。 – effeffe

+2

@effeffe等価!=等値。それらは異なる概念です。等価を設定したい場合は、 'not((a

+0

等価集合と等価集合の違いは何ですか? – effeffe

関連する問題