Предупреждение 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);
Ответы
Ответ 1
Это обычно происходит при включении заголовка Windows, который определяет макрос min
или max
. Если вы используете заголовки Windows, поместите #define NOMINMAX
в свой код или создайте с помощью эквивалентного компилятора (т.е. Используйте /DNOMINMAX для Visual Studio).
Обратите внимание, что создание с помощью NOMINMAX
отключает использование макроса во всей программе. Если вам нужно использовать операции min
или max
, используйте std::min()
или std::max()
из заголовка <algorithm>
.
Ответ 2
Другим решением было бы свернуть имя функции с помощью круглых скобок следующим образом: (std::numeric_limits<int>::max)()
. То же самое относится к std::max
.
Не уверен, что это хорошее решение для этого... NOMINMAX лучше IMO, но в некоторых случаях это может быть вариант.
Ответ 3
Некоторые другие файлы заголовков загрязняют глобальное пространство имен макросом max. Вы можете исправить это, определив макрос:
#undef max
x = std::numeric_limits<int>::max();
Ответ 4
#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
Ответ 5
Его определение для меня в Visual Studio 2013 (отформатированное для лучшего интервала...) выглядит следующим образом:
static _Ty (max)() _THROW0()
{ // return maximum value
return (FLT_MAX);
}
Поэтому я просто использую FLT_MAX.:) Это может быть не универсальное решение, но оно хорошо работает в моем случае, поэтому я думал, что буду делиться.