有一個類包含一些數據,並在某個時間點對它們進行排序。我使用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。它可以做任何事情,嘔吐整個記憶是更令人愉快的可能性之一。 –