0

我有简单的 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 *)'

它不是指向函数的指针吗?

4

2 回答 2

4

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

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

于 2013-08-06T14:20:20.450 回答
4

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

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

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

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

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

因此,您是传递C++成员函数,而qsort期望C类型函数作为谓词。

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

于 2013-08-06T14:25:12.173 回答