предупреждение C4003 и ошибки C2589 и C2059 при: x = std :: numeric_limits <int>:: max (); - PullRequest
56 голосов
/ 15 декабря 2009

Эта строка корректно работает в небольшой тестовой программе, но в программе, для которой я ее хочу, я получаю следующие жалобы компилятора:

#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);

Ответы [ 6 ]

74 голосов
/ 15 декабря 2009

Это обычно происходит при включении заголовка Windows, который определяет макрос min или max. Если вы используете заголовки Windows, вставьте #define NOMINMAX в ваш код или постройте с помощью эквивалентного параметра компилятора (то есть используйте / DNOMINMAX для Visual Studio).

Обратите внимание, что сборка с NOMINMAX отключает использование макроса во всей вашей программе. Если вам нужно использовать операции min или max, используйте std::min() или std::max() из заголовка <algorithm>.

62 голосов
/ 26 ноября 2012

Другим решением было бы заключить имя функции в круглые скобки следующим образом: (std::numeric_limits<int>::max)(). То же относится и к std::max.

Не уверен, что это хорошее решение для этого ... NOMINMAX лучше IMO, но в некоторых случаях это может быть вариант.

27 голосов
/ 15 декабря 2009

Какой-то другой заголовочный файл загрязняет глобальное пространство имен макросом max. Вы можете исправить это, отменив макрос:

#undef max
x = std::numeric_limits<int>::max();
3 голосов
/ 23 января 2015
#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
0 голосов
/ 11 апреля 2019

(STD :: numeric_limits :: макс) ()

Легко, как пирог.

0 голосов
/ 16 мая 2015

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

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

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

...