6

有一个类包含一些数据,它会在某个时间点对它们进行排序。我使用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*)’

那么如何以正确的方式做到这一点呢?

4

4 回答 4

7

如果您必须使用qsort而不是std::sort推荐),则声明成员方法static就足够了。

于 2012-10-02T11:25:11.840 回答
4

不要qsort在 C++ 中使用。使用std::sortboost/std::bind。成员函数指针不能转换为函数指针。你的方法应该是static,或者应该是free function

请参阅“指向成员函数”的类型与“指向函数”的类型不同吗?解释一下。

于 2012-10-02T11:24:26.613 回答
4

您将函数传递为&Data::compare_records,但您应该将其传递为Data::compare_records并使其成为static

于 2012-10-02T11:27:35.573 回答
0

尽管我使用 Qt 的 qSort()

函子可以很酷。

struct randomWSort
{
    SatoshiGame* This;
    randomWSort(SatoshiGame* g){This=g;}
    bool operator()(QString& a, QString& b)
    {
        return This->randomWSort(a,b);
    }
};

bool SatoshiGame::randomWSort(QString& a, QString& b)
{
    return rand->rnd() %2;
}

QString SatoshiGame::getRandomString(QStringList words)
{
    qSort(words.begin(), words.end(), ::randomWSort(this) );
    return words.at(0);
}
于 2013-08-18T16:30:31.773 回答