2011-12-08 3 views
2

컴파일러가이 기능을 올바르게 사용하고있는 것처럼 느껴집니다. sort_by_name 함수에서 stl 정렬 알고리즘을 사용하여 사전 순으로 코스 목록을 정렬하려고합니다. 이것은 내가 작성한 것을 대략입니다 :STL-Sort가 예상대로 작동하지 않습니다.

class SomeClass { 
    private: 
    struct course { 
     string id, name; 
    }; 
    vector<course> COURSES; 
    bool nameCmp(course a, course b) {return (a.name > b.name) ? true : false;} 
    public: 
    void sort_by_name() { 
     sort(COURSES.begin(), COURSES.end(), nameCmp); 
    } 
}; 

오류 : 어떤 도움에 미리

error: no matching function for call to ‘sort(std::vector<SomeClass::course>::iterator, std::vector<SomeClass::course>::iterator, <unresolved overloaded function type>)’ 

감사합니다.

답변

8

변경이 할 수있는 기능 :

static bool nameCmp(course a, course b) { return a.name > b.name; } 

더 좋은 const를 참조하여 인수를 전달하는 것입니다 course const & a

sort 알고리즘에서 nameCmp 함수를 호출하지 않을
+0

정말 고마워요. – kladd

-1

객체 또는 클래스와 관련하여 전역 네임 스페이스에서 호출합니다. 무료 함수로 만들거나 정적으로 만들고 SomeClass::nameCmp을 사용해야합니다.

+1

아니요, 네임 스페이스는 아무 관계가 없습니다. 암시적인 'this' 매개 변수 때문에 멤버 함수를'std :: sort'에 대한 비교 자로 사용할 수 없기 때문입니다. –

+0

@EtiennedeMartel, 내 생각을 잘못 이해 한 것 같습니다. 이 함수는'object-> nameCmp'에서와 같이 객체에서 호출되지 않으며'class :: nameCmp'에서와 같이 클래스 퍼스펙티브에서 호출되지 않습니다. 아마도 네임 스페이스는 잘못된 용어 였지만 더 나은 용어는 없었습니다. 내재적 인 'this'매개 변수는 객체 멤버 함수로 불리는 또 다른 방법이며, 생각하기에 더 혼란스러운 방법입니다. –

+0

문제는 클래스 이름을 지정하는 _ 필요가 없다는 것입니다. 다른 클래스의 정적 메서드를 참조하려면해야하지만 메서드 내부에있을 때는 이름 만 사용하면됩니다. Kerrek의 대답은 정확합니다. –

2
 bool SomeClass::nameCmp(course a, course b) {return (a.name > b.name) ? true : false;} 

SomeClass *this 매개 변수가 있습니다. 선언을 이동하거나 static으로 만들어 클래스 외부의 메서드를 만듭니다.

관련 문제