2013-08-06 3 views
0

내가 정렬 배열을 할 필요가 간단한 C++ 클래스가, 여기에 내가 무엇을 가지고 :C++ qsort가 오류합니다 (비교 예)

error C2664: 'qsort' : cannot convert parameter 4 from 'int (__thiscall GameController::*)(const void *,const void *)' to 'int (__cdecl *)(const void *,const void *)' 

어디에서 comperator가 기능하는 포인터가 아닙니까?

답변

4

오류 메시지를 이해하려고합시다.

int (__thiscall GameController::*)(const void *,const void *) 

당신은 반환 유형 int과 유형 const void *의 입력을 취하는 멤버 함수의 주소를 전달하는 데 노력하고있다. 단어 __thiscall은 호출 중에 C++ 멤버 함수를 전달하고 숨겨진 this 인수를 가짐을 나타냅니다.

int (__cdecl *)(const void *,const void *) 

__cdecl *는 다시 호출과 같은 일반 C 기능을 기대하는 의미합니다. 숨겨진 인수 this에 대해 알지 못합니다.

그래서, 당신은 qsort가 술어로 C 유형의 기능을 기대하면서이 C++ 멤버 함수를 전달합니다.

이 기능을 정적으로 변환하면 문제를 해결할 수 있습니다.

+0

답변 해 주셔서 감사합니다. – user63898

+0

https://isocpp.org/wiki/faq/pointers-to-members#fnptr-vs-memfnptr-types –

4

정적 멤버 함수 또는 비 멤버 함수에 대한 포인터를 전달해야합니다. comperator를 정적으로 만들거나 GameController 클래스에서 제거하십시오 (예를 들어 구현 내 이름없는 네임 스페이스에 배치).

이는 구성원 함수의 서명이 다르기 때문입니다. 객체를 호출해야합니다.