特征错误:please_protect_your_min_with_parentheses

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)

任何建议应该并且将非常感激

ybu*_*ill 8

它要求您将行更改为此行:

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标志.这通常不是由库代码完成的,因为它们不应该调整用户代码的配置.