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

재미 있지만 [http://edone.com/tn1huh]는 작동합니다. 이유는 모르겠다. 컴파일러는's'가 함수라고 생각할 것이다. – ilotXXI

답변

4

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

키가 오버로드를 사용하기 위해 (1-2)에 EqualityComparable로의 요구 사항을 충족해야합니다.
A, B 및 C, T 형 또는 형 구조 표현 T
을 감안할 경우

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

타입 T의 만족은 EqualityComparable로 다음과 같은 표현은 유효 그들의 지정된 효과가 있어야합니다 :
a == b

그래서, 당신은 네브라스카 IntWrapper 유형의 경우 operator==을 정의합니다.

+0

받아 들여지지 만 이해가되지 않습니다. 나를. 필요한 이유는 무엇입니까? 나는 이미 덜 - 비교를 정의하고있다, 그것으로부터 평등을 얻는 것은 쉽다. – effeffe

+2

@effeffe equivalence! = 동등. 그것들은 다른 개념입니다. 동등성을 설정하려면'not ((a

+0

집합 동등성과 집합 동등성의 차이점은 무엇입니까? – effeffe