일부 데이터가 포함 된 클래스가 있으며 특정 시점에 정렬합니다. 내가 qsort()
을 사용하고 나는 방법으로 클래스 내에서 비교 기능을 유지하고 싶습니다. 문제는 컴파일러 (g ++)가 경고를 던지지 않도록 메서드를 qsort()
에 전달하는 방법입니다.메소드를 qsort에 전달하는 방법은 무엇입니까?
error: cannot convert ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’ for argument ‘4’ to ‘void qsort(void*, size_t, size_t, int (*)(const void*, const void*))’
시도 2 :이 방법은 오류 발생
int Data::compare_records(void * rec_1, void * rec_2){
// [...]
}
void Data::sort(){
qsort(records, count, sizeof(*records), &Data::compare_records);
}
: 시도 1
warning: converting from ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’
:
void Data::sort(){
qsort(
records, count, sizeof(*records),
(int (*)(const void*, const void*)) &Data::compare_records
);
}
이 방법은 경고를 생성
어떻게 올바른 방법으로 할 수 있습니까?
C++에서'qsort'를 사용해서는 안됩니다. 못. 이제까지. 'std :: sort'는 * 빠르며, 유연하고 타입 안전합니다.'qsort'는 그 어느 것도 아닙니다. 적어도 평범한 C를 사용해야하는 환경에 가지 않는 한'qsort'는 결코 존재하지 않았다. –
'C' 함수'qsort' 대신'std :: sort'를 사용해야합니다. 이 함수가'void *'인수를 취한다는 사실은 컴파일러가 만들 수있는 대부분의 최적화를 무효화합니다 (conf. Hutter). – log0
실제로'Data'가 평범하지 않은 복사 생성자 또는 중요하지 않은 소멸자를 가지고 있다면,'qsort'를 사용하는 것은 정의되지 않은 행동입니다. 그것은 무엇이든 할 수 있으며, 온통 구토하는 것이 더 즐거운 가능성 중 하나입니다. –