1

我正在尝试为 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]

我实际上需要一个指针排序 - 我有一个单词的开始和结束字节数组(在从 VB.Net 托管代码传入的字符串中找到)。我还有一个包含“1,2,3 ...”的指针数组,我需要对指针进行排序。

似乎我不能用 std::sort 做到这一点,所以我实现了自己的 shell 排序......

4

2 回答 2

11

的签名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);
于 2012-07-29T21:36:22.220 回答
4

qsort是直接采用函数指针的旧 C API。您不能将它与其他任何东西一起使用,例如 lambdas。相反,使用std::sort.

于 2012-07-29T21:36:11.320 回答