2013-05-03 2 views
7

나는 클래스 포인터 std::vector<Square*> listSquares 벡터가 있습니다. 클래스의 속성 중 하나를 키로 정렬하려고합니다. 이것은 내가std :: sort() 클래스 포인터 벡터

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 

std::sort(listSquares.begin(), listSquares.end(), compById) 

을 뭘하는지하지만 컴파일러는 말한다 : 오류 : 종류 (표준 : : 벡터 :: 반복자 '에 대한 호출에 대한 일치하는 기능, 표준 : : 벡터 :: 반복자는, < 해결되지 않은 오버로드 함수 유형 >) '

여기서 내가 뭘 잘못하고 있니?

+6

,이 람다해야한다) {return a-> getId() < b-> getId;})'. – leftaroundabout

+2

실제로 포인터가 아니라 객체가 필요한지 확인하십시오. – chris

+0

C++ 11을 사용할 수 없습니다. @chris 포인터를 사용하고 싶습니다. – qutab

답변

12

compByIdstd::sort에 대한 매개 변수로 사용하려면 멤버 함수가 아니어야합니다. 이

class Square 
{ 
    ... 
}; 

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 
+0

정말 고마워요. 이것이 문제였습니다. 그런데 왜 우리는 그것을 구성원 함수로 선언 할 수 없습니까? 사실 저는 사각형 자체와 다른 클래스에서 사용하고 있습니다. – qutab

+2

std :: sort는 멤버 함수를 호출 할 때 사용할 객체를 어떻게 알 수 있습니까? 멤버 함수는 객체에 대해서만 호출 할 수 있지만 std :: sort에는 어떤 객체가 있어야 하는지를 결정할 컨텍스트가 없습니다. 아마 당신은 std :: sort를 어떤 객체 내부에서 호출하고있다. 그러나 그 객체를 std :: sort에 전달하지는 않을 것이다. std :: sort는 어디에서 호출되는지에 대해 아무것도 모릅니다. 전달하는 세 개의 매개 변수는 모두 알고 있습니다. – john

+3

텔레파시 스킬 +1 – Basilevs

3

가장 중요한 부분은 compare 함수의 인수가 const이라는 것입니다. 다른 하나는 반환 유형입니다. 함수를 선언 할 때 반환 형식을 생략하면 컴파일러에서이 경우에 int을 반환한다고 가정합니다.

물론 std::sort 함수를 호출 할 때 비교 함수가 범위 내에 있어야합니다.

+0

const를 사용하더라도 동일한 오류가 발생합니다. 이 경우에 나는 또한 얻는다 :gameplay.cpp : 911 : 오류 : 'const Square'를 'int Square :: getId()'의 'this'인수로 전달하면 한정자를 무시한다. [-fpermissive] – qutab

+1

@qutab getId() const 멤버 함수. – richselian

1

당신은 멤버 함수를 사용할 수

class Square 
{ 
    bool compById(Square* a, Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
    ... 
}; 

이 더 잘못된 것입니다. 그러나 정적 멤버 함수로 정의하고 클래스의 인스턴스가 아니라 클래스에서 호출해야합니다.

함수 선언 앞에 static이 있고 정렬에 함수 이름 앞에 Square::이 있습니다. `표준 : : 정렬 (listSquares.begin(), listSquares.end(), [] (광장 *는, 광장 *의 B : 당신이 C++ (11)를 사용할 수있는 경우

class Square 
{ 
    /*...*/ 
public: 
    static bool compById(const Square* a, const Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
}; 

main() 
{ 
    /*...*/ 
    std::sort(listSquares.begin(), listSquares.end(), Square::compById); 
}