いくつかのデータを含むクラスがあり、ある時点でそれらをソートします。私は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'を使うことは未定義の動作です。それはまったく何事も行うことができ、メモリ全体を嘔吐することはより楽しい可能性の1つです。 –