今私はC++ 11で遊んでいますが、ラムダをsqliteのコールバックとして使用する場合、次の問題があります。ラムダ内のベクトル変数をキャプチャすると、署名が一致しないというエラーが表示されます。ラムダ([]
の変数を[&ret]
の代わりに使用し、ret
を使用しない場合)は、正常に動作します。キャプチャされた変数あり/なしのラムダ間のシグネチャの違い?
vector<SomeClass> ret;
char *err = nullptr;
int res = sqlite3_exec(db,
"some sql query, doesn't matter",
[&ret](void *unused, int argc, char **argv, char **columnName) -> int
{
ret.push_back(SomeClass());
return 0;
},
nullptr,
&err);
これは私が取得エラーです:
cannot convert 'TestClass::testMethod()::<lambda(void*, int, char**, char**)>' to 'int (*)(void*, int, char**, char**)' for argument '3' to 'int sqlite3_exec(sqlite3*, const char*, int (*)(void*, int, char**, char**), void*, char**)'
GCCのバージョンは、 "GCC(XvidVideo.RU - GCC 4.6.1はi686-PC-MINGW32)4.6.1 20110625(プレリリース)" である上Windows。
なぜこれが違いますか?
これはVS2010のIMPLにおける既知のバグであれば誰もが知っています...私は、Visual Studio 2010のコンパイラで同じことをしようとしているし、それはラムダの形態のいずれかを好きではありませんか? –