2010-03-12 4 views
19

나는 struct의 항목을 포함 내림차순으로 목록 (클래스의 일부를) 정렬 할 노력하고있어,하지만 컴파일되지 않습니다정렬 목록을 사용하여 STL 정렬 기능

error: no match for 'operator-' in '__last - __first'

sort(Result.poly.begin(), Result.poly.end(), SortDescending()); 

을 그리고 여기 SortDescending는 다음과 같습니다

struct SortDescending 
{ 
    bool operator()(const term& t1, const term& t2) 
    { 
     return t2.pow < t1.pow; 
    } 
}; 

는 사람이 뭐가 잘못 말해 줄래?

+0

@Glen 참조하십시오. http://stackoverflow.com/questions/2425452/polynomial-operations-using-operator-overloading – Vlad

답변

33

std::list 변화에 작동하지 않는 것은 std::list<>::iterator들 (리스트 반복자는 양방향 반복자입니다)하지 않은 임의 접근 반복자가 필요합니다.

회원 기능은 이어야합니다.

+0

하지만 난 내 클래스 – Vlad

+2

@ Vlad에 대한 적은 연산자를 올바르게 오버로드하는 방법을 모르겠다, 당신은 아무것도 오버로드하지 않아도됩니다. 'Result.poly.sort (SortDescending());'잘 작동해야합니다. – Glen

+1

비교 자의'operator()'는 멤버를 수정하지 않으므로 * 여전히 * const *로 표시되어야합니다. –

10

std::list이 내장되어있는 당신이 std::list::iterator 단지 반복자의 양방향 반복자 클래스에 속하는 반면 std::sort 만, 임의 접근 반복자와 함께 작동하기 때문에 사용할 필요가 sort 방법.

Result.poly.sort(SortDescending()); 

또한, 당신의 operator()const를 표시해야합니다.

Result.poly.sort(std::greater<term>()); 
+0

아니요.이 표준에는 아무것도 필요하지 않습니다. 이것은 const 일 필요가 없습니다. 오류 메시지를 보면 입력 반복자에 대해 '연산자'가없는 것처럼 보입니다. –

+0

재정렬 된 경우 더 나은 답변을 얻을 수 있습니다 (const-ness는 여기에서 측면 문제 임). – visitor

+0

여전히 내 자신의 비교 자 또는 큰() 사용하여 여전히 작동하지 않습니다 오류 무리를 제공합니다. – Vlad

4

그것은 Result.poly가에 대한 반복자 유형처럼 보인다 :

struct SortDescending 
{ 
    bool operator()(const term& t1, const term& t2) const 
    { 
     return t2.pow < t1.pow; 
    } 
}; 

마지막으로, 당신은 단순히 (표준 헤더 <functional>에 위치) std::greater<T>를 사용하는을위한 당신의 자신의 비교자를 작성할 필요가 없습니다 누락 된 operator -. std::sort 표준 알고리즘 std::sortResult.poly.sort

+0

하지만 난 내 클래스 – Vlad

+0

@ Vlad 당신이'Result.poly.sort (SortDescending())'에 의해 이것을 호출 할 수있는 적은 연산자를 정확하게 오버로드하는 방법을 모르겠다'연산자 <'에 대한 필요가 없습니다. –

+0

@ Konrad 나는 그가'operator <'에 대해 이야기하고 있으며 술어를 취하는'std :: ist :: sort' 버전이 있다는 사실을 놓쳤다 고 생각합니다. –