指向函数(compar)的指针出现c++qsort错误

c++ qsort error with Pointer to a function (the compar)

本文关键字:指针 c++qsort 错误 函数 compar      更新时间:2023-10-16

我有一个简单的c++类,需要对数组进行排序,下面是我所拥有的:

void GameController::sortArray(CCArray *&sameRowGemArray)
{
        qsort(sameRowGemArray->data->arr, sameRowGemArray->data->num, sizeof(long), &GameController::comperator);

}
int  GameController::comperator(const void * a, const void * b)
{
  /*
  ..didn't implement logic first i need it to compile 
  */
    return 1;
}

但我得到的编译错误说:

error C2664: 'qsort' : cannot convert parameter 4 from 'int (__thiscall GameController::* )(const void *,const void *)' to 'int (__cdecl *)(const void *,const void *)'

它不是指向编译器所在位置的函数吗?

让我们试着理解错误消息。

int (__thiscall GameController::* )(const void *,const void *)

您正试图传递一个成员函数的地址,该函数的返回类型为int,并接受类型为const void *的输入。单词__thiscall表示您正在传递一个C++成员函数,并且在调用过程中具有隐藏的this参数。

int (__cdecl *)(const void *,const void *)

__cdecl *表示它期望一个普通的C函数作为回调。请注意,它不知道隐藏的参数this

因此,您正在传递一个C++成员函数,而qsort需要一个C类型的函数作为谓词。

您可以将函数转换为静态函数,这将解决问题。

您需要传递一个指向静态成员函数或非成员函数的指针。要么将comperator设置为静态,要么将其从类GameController中删除(例如,将其放置在实现中的未命名命名空间中)。

这是因为成员函数的签名不同;它需要调用一个对象。