c++ - 如何将方法传递给 qsort?

标签 c++

有一个包含一些数据的类,它在某个时间点对它们进行排序。我使用 qsort() 并且我想将比较函数作为一种方法保留在类中。问题是如何将方法传递给 qsort() 以便编译器 (g++) 不抛出任何警告?

尝试 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*)’

那么如何正确地做到这一点呢?

最佳答案

如果必须使用qsort而不是std::sort(推荐),将成员方法声明为static 应该足够了。

关于c++ - 如何将方法传递给 qsort?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12689376/

相关文章:

c++ - 什么是三法则?

c++ - 在以下情况下可以使用goto吗?

c++ - 包含主项目中的文件时单元测试项目中的错误

c++ - (错误) 'operator>>' 中的 'std::cout >> namesArray(counter)(0)' 不匹配

c++ - 如何使用命名空间系统;使用 VC++ 在 MFC 应用程序中

c++ - 文件删除(使用取消链接)和释放所有磁盘空间之间的延迟

c++ - 安装 PySide - OSX

c++ - 使用非英文文件名调用 avio_open 函数无效

c++ - 如何将 Boost.Phoenix 中的一系列语句与 std::transform 一起使用?

c++ - QTableView 如何判断 Row 是否被选中?