2013-02-28 5 views
1

과부하를 걸고 < (이하) 비교기를 정수 쌍의 집합으로 전달하는 방법을 알고 싶습니다.페어 세트에 대한 비교 연산자를 오버로드하는 방법은 무엇입니까?

class A{ 
public: 

typedef std::pair<int, int> pair_type; 

bool operator<(const pair_type& a, const pair_type& b){ 
    if (a.first < b.first) return true; 
    else if ((a.first == b.first) && (a.second < b.second)) return true; 
    else return false; 
} 

private: 
std::set<pair_type> edge_; 

}; 

이 오류가 발생합니다. 어떻게 해결할 수 있습니까?

error: 'bool A::operator<(const pair_type&, const pair_type&)' must take exactly one argument 
+2

는 '표준 : pair' 이미 [적정을 갖는다 operator <] (http://en.cppreference.com/w/cpp/utility/pair/operator_cmp)를 참조하십시오. – Mankarse

답변

4
class A{ 
public: 
    typedef std::pair<int, int> pair_type; 

    struct compare { 
     bool operator()(const pair_type& a, const pair_type& b) { 
      if (a.first < b.first) return true; 
      else if ((a.first == b.first) && (a.second < b.second)) return true; 
      else return false; 
     } 
    }; 

    private: 
    std::set<pair_type, compare> edge_; 
}; 
+1

왜 구조체 안에 연산자를 넣어야합니까? – Ediolot

2

연산자는 A 클래스와 아무 관계가 없으므로 자유 기능 (구성원 기능이 아님)이어야합니다.

2

넌 (단일 파라미터, 동일한 클래스의 보통 다른 인스턴스) 반원으로서 연산자 과부하 definining한다 :

class pair_type : public std::pair<int, int> 
{ 
public: 
    bool operator<(const pair_type &comp) const 
    { 
     if (this->first < comp.first) return true; 
     else if ((this->first == comp.first) && (this->second < comp.second)) return true; 
     else return false; 
    } 
}; 
+0

비교 연산자는 결코 멤버 함수가 아니어야합니다. 가장 적절한 기술은 같은 유형의 두 가지 인수를 취하는 "친구"연산자로 선언하는 것입니다. – Kastorskij

+0

@Kastorskij 아, 고마워, 네 말이 맞아. 필자는 멤버 함수 버전을 더 자주 사용하는 것을 인정해야하지만 여기에서 더 자세히 설명 된 것처럼 friend 함수를 사용하는 것이 합리적입니다. [link] (http://stackoverflow.com/questions/11633059/comparing-objects-using- bool-operator) – Derek

관련 문제