Подтвердить что ты не робот

Предупреждение 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);

4b9b3361

Ответ 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.:) Это может быть не универсальное решение, но оно хорошо работает в моем случае, поэтому я думал, что буду делиться.