2013-08-06 68 views
0

我有简单的C++类那里我需要做的排序阵列,这里是我有:C++快速排序与指针错误的函数(COMPAR)

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 *)' 

是不是它指针功能在哪里是comperator?

回答

4

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

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类型函数作为谓词。

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

+0

感谢您的回答! – user63898

+0

https://isocpp.org/wiki/faq/pointers-to-members#fnptr-vs-memfnptr-types –

4

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

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