私のプロジェクトのいくつかでは、次のコード:
#include <functional>
class SmallClass
{
public:
int x1, y1;
void TestFunc()
{
auto BadLambda = [&]()
{
int g = x1 + 1; //ok
int h = y1 + 1; //c2296
int l = static_cast<int>(y1); //c2440
};
int y1_copy = y1; //it works if you create a local copy
auto GoodLambda = [&]()
{
int h = y1_copy + 1; //ok
int l = this->y1 + 1; //ok
};
}
};
生成する
エラー C2296: '+': 不正です。左側のオペランドの型は 'double (__cdecl *)(double)' です
または代わりに
エラー C2440: 'static_cast': 'double (__cdecl *)(double)' から 'int' に変換できません
あなたは絵を手に入れます。値でキャッチした場合にも発生します。
エラーはメンバー名「y1」に紐付いているようです。それは、さまざまなクラス、さまざまなプロジェクトで、(一見) y1 の任意の型で発生しました。たとえば、次のコード:
[...]
MyClass y1;
void TestFunc()
{
auto BadLambda = [&]()->void
{
int l = static_cast<int>(y1); //c2440
};
}
次の両方のエラーが生成されます。
エラー C2440: 'static_cast' : 'MyClass' から 'int' に変換できません この変換を実行できるユーザー定義変換演算子がないか、演算子を呼び出すことができません
error C2440: 'static_cast' : 'double (__cdecl *)(double)' から 'int' に変換できません この変換が可能なコンテキストはありません
「機能的」ライブラリにリンクされているようです。「機能」のみを含む最小限のプロジェクトで(私のマシンで)発生します(はい、括弧の間にあるはずですが、HTMLで失敗します)。
既知のバグではないようで、途方に暮れています。なぜこれが起こるのかについてのアイデアはありますか? (回避策は必要ありません。コードには既にいくつかあります)。
編集:実際、math.hの関数に関連しています:
_CRT_NONSTDC_DEPRECATE(_cabs) _CRTIMP double __cdecl cabs(In struct _complex _X);
_CRT_NONSTDC_DEPRECATE(_j0) _CRTIMP double __cdecl j0(In double _X);
_CRT_NONSTDC_DEPRECATE(_j1) _CRTIMP double __cdecl j1(In double _X);
_CRT_NONSTDC_DEPRECATE(_jn) _CRTIMP double __cdecl jn(In int _X, In double _Y);
_CRT_NONSTDC_DEPRECATE(_y0) _CRTIMP double __cdecl y0(In double _X);
_CRT_NONSTDC_DEPRECATE(_y1) _CRTIMP double __cdecl y1(In double _X);
_CRT_NONSTDC_DEPRECATE(_yn) _CRTIMP double __cdecl yn(In int _X, In double _Y);
これらの関数名のいずれかを使用すると、バグが発生します。math.h、cmath、または機能をインクルードするときに発生します。これらの名前がどのようにして私のラムダ式の範囲に入ったのか、誰かが手がかりを持っているのではないでしょうか?
編集:解決しました。これは、VS2010 (およびおそらく他の古いコンパイラ) でのラムダ名解決の問題です。グローバル名を定義する場合、または「名前空間 x を使用する」を使用する場合は、ラムダで非修飾名を使用しないでください。
Visual Studio 2010 Express バージョン 10.0.40219.1 SP1Rel を使用します。