Собственная ошибка: please_protect_your_min_with_parentheses

Я пытаюсь протестировать возможности нелинейной оптимизации 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();

Любой совет должен и будет высоко ценится

5

Решение

Он просит вас изменить строку на эту:

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

Так что если min Функциональный макрос определен, он не будет заменен.

Проблема в том, что заголовки Microsoft Windows определяют min макрос, поэтому стандартный код C ++, включающий заголовки Windows, может не скомпилироваться. Решение, которое реализуют переносимые библиотеки C ++, заключает их вызовы в стандарт min функции с круглыми скобками, как указано выше. Тестовый код, который вы компилируете, похоже, проверяет, что этот метод используется кодом.

Проблема вышеуказанного подхода заключается в том, что вы не сможете выполнить неквалифицированный вызов min(a,b) с поиском, зависящим от аргумента, поскольку добавление скобок приводит к тому, что имя ищется независимо от аргументов.

Другое решение, которое можно применить к ее собственному коду, состоит в том, чтобы определить флаг NOMINMAX перед включением любого заголовка Windows или отменой определения min/max макросы. Обычно это не делается библиотечным кодом, поскольку они не должны изменять конфигурацию пользовательского кода.

7

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]