2013-08-06 43 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中移除(例如,將它放在實現中的未命名名稱空間中)。

這是因爲成員函數的簽名是不同的;它需要一個對象被調用。