指向函数(compar)的指针出现c++qsort错误
c++ qsort error with Pointer to a function (the compar)
我有一个简单的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中删除(例如,将其放置在实现中的未命名命名空间中)。
这是因为成员函数的签名不同;它需要调用一个对象。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- 何时在引用或唯一指针上使用移动语义
- QMetaObject invokeMethod的基于函数指针的语法
- 如何从 std::atomic 中提取指针 T<T>?
- 如何在 C# 中映射双 C 结构指针?
- C++将浮点指针值舍入为小数位数
- 为什么++(*p)更改指针值
- 调整大小后指向元素值的指针unordered_map有效?
- 如何获取指向 qsort 第一个参数的向量中第一项的指针?
- 指向函数(compar)的指针出现c++qsort错误
- qsort中的无效指针算法
- 与将标准作为模板参数传递给sort()相比,将标准函数指针传递给qsort()的开销更小