我正在尝试通过运行软件包附带的测试代码来测试Eigen的NonLinear优化功能。
我被这些错误卡住了(更像是困惑):
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错误指的是这一行(在上面提到的两个不同位置,即第28行和第184行):
const Scalar dwarf = std::numeric_limits<Scalar>::min();任何建议都将不胜感激。
发布于 2012-12-04 05:19:59
它会要求您将行更改为以下一行:
const Scalar dwarf = (std::numeric_limits<Scalar>::min)();因此,如果定义了类似min函数的宏时,它将不会被替换。
问题在于,Microsoft Windows头文件定义了Windows宏,因此包含min头文件的标准C++代码可能无法编译。如上所述,可移植C++库实现的解决方案是使用括号将它们对标准min函数的调用包装起来。您编译的测试代码似乎会检查代码是否使用了这种技术。
上述方法的问题在于,您将无法使用参数相关查找执行对min(a,b)的非限定调用,因为添加括号会导致名称独立于参数进行查找。
另一种可以应用于自己的代码的解决方案是在包含任何Windows头文件或取消定义min/max宏之前定义NOMINMAX标志。这通常不是由库代码完成的,因为它们不应该调整用户代码的配置。
https://stackoverflow.com/questions/13691822
复制相似问题