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 戻り値の型を持つように指定されたラムダは値を返すことができません

[7/30 午後 3 時 55 分に編集]

私は実際にポインターの並べ替えが必要でした - 単語の開始バイトと終了バイトの配列を持っています (VB.Net マネージ コードから渡された文字列に含まれています)。「1,2,3...」を含むポインタ配列もあり、ポインタをソートする必要がありました。

std::sort ではそれができないようだったので、独自のシェルソートを実装しました...

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 です。ラムダなど、他のものと一緒に使用することはできません。代わりに、を使用してstd::sortください。

于 2012-07-29T21:36:11.320 に答える