有一个类包含一些数据,并在某个时间点对它们进行排序。我使用qsort()
,我想保留类中的比较函数作为方法。问题是如何将方法传递给qsort()
以便编译器(g ++)不会抛出任何警告?如何将方法传递给qsort?
尝试1:
int Data::compare_records(void * rec_1, void * rec_2){
// [...]
}
void Data::sort(){
qsort(records, count, sizeof(*records), &Data::compare_records);
}
这种方式产生一个错误:
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:
void Data::sort(){
qsort(
records, count, sizeof(*records),
(int (*)(const void*, const void*)) &Data::compare_records
);
}
这种方式生成一个警告:
warning: converting from ‘int (Data::*)(const void*, const void*)’ to ‘int (*)(const void*, const void*)’
如何以正确的方式做到这一点呢?
你不应该在C++中使用'qsort'。决不。永远。 'std :: sort'是*更快*,更灵活和类型安全,'qsort'不是。只要忘记'qsort'曾经存在过,至少除非你到了需要使用普通C的环境。 –
你应该使用'std :: sort'而不是'C'函数'qsort'。这个函数使用'void *'参数这一事实违背了编译器可以做出的大多数优化(conf H. Sutter)。 – log0
事实上,如果'Data'具有非平凡的拷贝构造函数或非平凡的析构函数,那么使用'qsort'就是Undefined Behavior。它可以做任何事情,呕吐整个记忆是更令人愉快的可能性之一。 –