【发布时间】:2012-11-07 01:17:18
【问题描述】:
在我的几个项目中,以下代码:
#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 *)(双)'
或者
错误 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” 可以执行此操作的用户定义转换运算符 转换,否则无法调用操作符
错误 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 或函数时会发生这种情况。也许有人知道这些名字是如何进入我的 lambda 表达式范围的?
编辑:已解决。这是 VS2010(可能还有其他较旧的编译器)中的 lambda 名称解析问题。如果您定义全局名称或使用“使用命名空间 x”,请避免在 lambdas 中使用非限定名称。
使用 Visual Studio 2010 Express 版本 10.0.40219.1 SP1Rel。
【问题讨论】:
-
您可能需要发布更多代码,以便我们了解另一个
y1在哪里以及它如何影响程序 -
我只能说“哇!很酷的错误!”...我建议您将其报告为错误...最有可能返回 Lua 社区。 Aniket 一针见血……真正的问题(如我所见)是:“ y1 的这种替代(双重)定义(我现在简单地避免使用的名称)如何进入范围?”
-
那有问题...我没能找到它。事实上,文本“y1”并没有出现在 Lua 文件中的任何地方,所以它可能来自其他地方,但我不知道在哪里。其中一个项目非常小(我基本上是在测试一些代码),它只链接 Lua 和标准库。
-
@corlettk 这正是我有兴趣回答的问题!你措辞完美。
-
y1 来自标准数学库 math.h(或 cmath)。这是第二类贝塞尔函数,一阶。
标签: c++ visual-studio-2010 lambda