Я пытаюсь протестировать возможности нелинейной оптимизации 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();
Любой совет должен и будет высоко ценится
Он просит вас изменить строку на эту:
const Scalar dwarf = (std::numeric_limits<Scalar>::min)();
Так что если min
Функциональный макрос определен, он не будет заменен.
Проблема в том, что заголовки Microsoft Windows определяют min
макрос, поэтому стандартный код C ++, включающий заголовки Windows, может не скомпилироваться. Решение, которое реализуют переносимые библиотеки C ++, заключает их вызовы в стандарт min
функции с круглыми скобками, как указано выше. Тестовый код, который вы компилируете, похоже, проверяет, что этот метод используется кодом.
Проблема вышеуказанного подхода заключается в том, что вы не сможете выполнить неквалифицированный вызов min(a,b)
с поиском, зависящим от аргумента, поскольку добавление скобок приводит к тому, что имя ищется независимо от аргументов.
Другое решение, которое можно применить к ее собственному коду, состоит в том, чтобы определить флаг NOMINMAX перед включением любого заголовка Windows или отменой определения min
/max
макросы. Обычно это не делается библиотечным кодом, поскольку они не должны изменять конфигурацию пользовательского кода.
Других решений пока нет …