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

(СТД::numeric_limits:: макс)()

Проще простого.

Его определение для меня в Visual Studio 2013 (отформатировано для лучшего разнесения...) выглядит следующим образом:

static _Ty (max)() _THROW0()
{   // return maximum value
    return (FLT_MAX);
}

Так что я просто использую FLT_MAX.:) Это может быть не универсальное решение, но оно хорошо работает в моем случае, поэтому я подумала, что поделюсь.

Другие вопросы по тегам