Предупреждение C4003 и ошибки C2589 и C2059 на: x = std:: numeric_limits<int>:: max ();
Эта строка корректно работает в небольшой тестовой программе, но в программе, для которой я ее хочу, я получаю следующие жалобы компилятора:
#include <limits>
x = std::numeric_limits<int>::max();
c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max'
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::'
c:\...\x.cpp(192) : error C2059: syntax error : '::'
Я получаю те же результаты с:
#include <limits>
using namespace std;
x = numeric_limits<int>::max();
Почему он видит max как макрос max(a,b);?
5 ответов
Это обычно происходит при включении заголовка Windows, который определяет min
или же max
макро. Если вы используете заголовки Windows, поставьте #define NOMINMAX
в вашем коде или соберите с эквивалентным ключом компилятора (т.е. используйте /DNOMINMAX для Visual Studio).
Обратите внимание, что здание с NOMINMAX
отключает использование макроса во всей вашей программе. Если вам нужно использовать min
или же max
операции, использование std::min()
или же std::max()
от <algorithm>
заголовок.
Другим решением было бы заключить имя функции в круглые скобки следующим образом: (std::numeric_limits<int>::max)()
, То же относится и к std::max
,
Не уверен, что это хорошее решение для этого... NOMINMAX лучше IMO, но в некоторых случаях это может быть вариантом.
Другой заголовочный файл загрязняет глобальное пространство имен макросом max. Вы можете исправить это, отменив макрос:
#undef max
x = std::numeric_limits<int>::max();
#ifdef max
#pragma push_macro("max")
#undef max
#define _restore_max_
#endif
#include <limits>
//... your stuff that uses limits
#ifdef _restore_max_
#pragma pop_macro("max")
#undef _restore_max_
#endif
Его определение для меня в Visual Studio 2013 (отформатировано для лучшего разнесения...) выглядит следующим образом:
static _Ty (max)() _THROW0()
{ // return maximum value
return (FLT_MAX);
}
Так что я просто использую FLT_MAX.:) Это может быть не универсальное решение, но оно хорошо работает в моем случае, поэтому я подумала, что поделюсь.