6

我正在尝试通过运行包附带的测试代码来测试 Eigen 的非线性优化功能。

我对这些错误感到困惑(更像是困惑):

Error   5   error C2039: 'please_protect_your_min_with_parentheses' : is not a member of 'std::numeric_limits<double>'  c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    184
Error   7   error C2039: 'please_protect_your_min_with_parentheses' : is not a member of 'std::numeric_limits<double>'  c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    28
Error   6   error C2065: 'please_protect_your_min_with_parentheses' : undeclared identifier c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    184
Error   8   error C2065: 'please_protect_your_min_with_parentheses' : undeclared identifier c:\program files (x86)\microsoft sdks\windows\v7.0a\include\eigen-eigen-5097c01bcdc4\unsupported\eigen\src\nonlinearoptimization\lmpar.h    28

顺便说一下(我认为)导致这种情况的线路是这样的:

#define min(A,B) please_protect_your_min_with_parentheses

并且错误指的是这一行(在上面提到的 2 个不同的地方,即第 28 行和第 184 行):

const Scalar dwarf = std::numeric_limits<Scalar>::min();

任何建议都将不胜感激

4

1 回答 1

8

它要求您将这一行改为这一行:

const Scalar dwarf = (std::numeric_limits<Scalar>::min)();

因此,如果min定义了类似函数的宏,则不会被替换。

问题是 Microsoft Windows 标头定义了min宏,因此包含 Windows 标头的标准 C++ 代码可能无法编译。可移植 C++ 库实现的解决方案是min用括号将它们对标准函数的调用包装起来,如上所述。您编译的测试代码似乎检查了代码是否使用了这种技术。

上述方法的问题在于,您将无法min(a,b)使用参数相关查找执行不合格的调用,因为添加括号会导致名称独立于参数进行查找。

min可以应用于她自己的代码的另一种解决方案是在包含任何 Windows 标头或取消定义/max宏之前定义 NOMINMAX 标志。这通常不是由库代码完成的,因为它们不应该调整用户代码的配置。

于 2012-12-03T21:19:58.553 回答