2017-01-22 54 views
2

我正在使用用戶自定義類型集和自定義比較函數。當我嘗試在集合之間使用==運算符時,出現編譯時錯誤。我錯過了什麼?與自定義比較功能設置相等

#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 
} 

Here you can see the error.

+0

你的'operator =='(和'operator!=')在哪裏? – Toris

+1

自定義比較器用於比較集合中的元素,不用於比較集合 – Loreto

+0

這很有趣,但[this](http://ideone.com/tn1huh)起作用。不知道爲什麼,可能是編譯器認爲's'是一個函數。 – ilotXXI

回答

4

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

的密鑰必須滿足以使用過載(1-2)相等性的要求。

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

類型T滿足相等性如果
給定一個,b和c,T型或const的表達t
以下表達式必須是有效的,並且具有其指定的效果:
a == b

因此,你ne編輯爲IntWrapper類型定義operator==

+0

接受,但它沒有意義我。爲什麼需要?我已經定義了一個比較小的比較,很容易從中獲得平等。 – effeffe

+2

@effeffe等價!=平等。這些是不同的概念。如果你想設置等價性,你可以使用'not((a

+0

集合等價和集合相等有什麼區別? – effeffe