特征错误:请使用密码保护您的最小值

Eigen error: please_protect_your_min_with_parentheses

本文关键字:最小值 密码保护 请使用 错误 特征      更新时间:2023-10-16

我正试图通过运行包附带的测试代码来测试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 sdkswindowsv7.0aincludeeigen-eigen-5097c01bcdc4unsupportedeigensrcnonlinearoptimizationlmpar.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 sdkswindowsv7.0aincludeeigen-eigen-5097c01bcdc4unsupportedeigensrcnonlinearoptimizationlmpar.h    28
Error   6   error C2065: 'please_protect_your_min_with_parentheses' : undeclared identifier c:program files (x86)microsoft sdkswindowsv7.0aincludeeigen-eigen-5097c01bcdc4unsupportedeigensrcnonlinearoptimizationlmpar.h    184
Error   8   error C2065: 'please_protect_your_min_with_parentheses' : undeclared identifier c:program files (x86)microsoft sdkswindowsv7.0aincludeeigen-eigen-5097c01bcdc4unsupportedeigensrcnonlinearoptimizationlmpar.h    28

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

#define min(A,B) please_protect_your_min_with_parentheses

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

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

将非常感谢任何建议

它请求您将行更改为以下行:

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

这样,如果定义了类似于宏的min函数,它就不会被替换。

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

上述方法的问题是,您将无法使用依赖于参数的查找来执行对min(a,b)的非限定调用,因为添加括号会导致名称的查找独立于参数。

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