Can*_*lik 6 c++ visual-studio-2010 nonlinear-optimization eigen
我正在尝试通过运行包附带的测试代码来测试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
Run Code Online (Sandbox Code Playgroud)
顺便说一句(我认为)导致这样的行:
#define min(A,B) please_protect_your_min_with_parentheses
Run Code Online (Sandbox Code Playgroud)
并且错误是指这一行(在上面提到的2个不同的地方,作为第28和184行):
const Scalar dwarf = std::numeric_limits<Scalar>::min();
Run Code Online (Sandbox Code Playgroud)
任何建议应该并且将非常感激
它要求您将行更改为此行:
const Scalar dwarf = (std::numeric_limits<Scalar>::min)();
Run Code Online (Sandbox Code Playgroud)
因此,如果min定义了类似函数的宏,则不会替换它.
问题是Microsoft Windows标头定义了min宏,因此包含Windows标头的标准C++代码可能无法编译.可移植C++库实现的解决方案是min使用括号将其调用包装到标准函数中,如上所述.您编译的测试代码似乎检查代码是否使用了此技术.
上述方法的问题在于,您将无法min(a,b)使用参数依赖查找执行非限定调用,因为添加括号会导致查找名称而不依赖于参数.
可以应用于自己的代码的另一个解决方案是在包含任何Windows标头或取消定义min/ max宏之前定义NOMINMAX标志.这通常不是由库代码完成的,因为它们不应该调整用户代码的配置.