我正在尝试为qsort的比较器创建一个内联函数 - 类似这样:
function<int(int,int)> comparesort = [smarkers, emarkers, strSearch] (int *arg1, int *arg2) { return 0; };
qsort(sortptrs, nKeywords, sizeof(int), comparesort);
它给了我这个错误
IntelliSense:没有合适的转换函数从“std :: tr1 :: function”到“int(__ cdecl *)(const void *,const void *)”存在
好的 - 我把它改成了这个
auto comparesort = [sortptrs, smarkers, emarkers, strSearch] (int arg1, int arg2)
{
int a = 0;
.
.
.
return a;
};
std::sort(sortptrs, sortptrs + nKeywords, comparesort);
并且它出错了:
错误C3499:已指定具有void返回类型的lambda无法返回值
[编辑于7/30 3:55 pm]
我实际上需要一个指针排序 - 我有一个单词的开始和结束字节数组(在从VB.Net托管代码传入的字符串中找到)。我还有一个包含“1,2,3 ...”的指针数组,我需要对指针进行排序。
似乎我不能用std :: sort做到这一点所以我实现了自己的shell排序......
答案 0 :(得分:9)
qsort
的签名采用类型为int(*)(const void*, const void*)
的函数指针。你试图给它一个function<int(int, int)>
,它不是一个函数指针,而是一个封装东西的对象(可能是一个函数ptr,可能是一个仿函数),它可以被调用为int(int, int)
(注意它没有正确的签名,即使它是一个函数指针)。
qsort
基本上是与c向后兼容的遗留函数。
在c ++中,我强烈建议忘记它并使用std::sort
代替:
auto comparesort = [smarkers, emarkers, strSearch] (const int& arg1, const int& arg2) { return false; };
//directly store the lambda, avoiding the overhead of creating a `function<...>`
std::sort(sortptrs, sortptrs + nKeywords, comparesort);
答案 1 :(得分:4)
qsort
是旧的C API,它直接获取函数指针。你不能将它与lambdas等其他东西一起使用。相反,请使用std::sort
。