Std:: max - ожидается идентификатор
У меня проблема с std::max
. Я не могу понять.
int border = 35;
int myInt = 2;
int myOtherInt = 3;
int z = std::max(myInt + 2 * border, myOtherInt + 2 * border);
Я включил стандартный заголовок алгоритма. Когда я нажимаю на max, я получаю:
Ошибка: ожидается идентификатор
И ошибки компиляции:
ошибка C2589: '('
: незаконный токен с правой стороны '::'
ошибка C2059: синтаксическая ошибка: '::'
Что не так?
Ответы
Ответ 1
Опасность угадывания, поскольку вы используете VС++ – поставьте это перед любым #include
s:
#define NOMINMAX
windows.h
определяет макросы с именем min
и max
следующим образом:
#define min(a,b) (((a) < (b)) ? (a) : (b))
#define max(a,b) (((a) > (b)) ? (a) : (b))
В Windows SDK были включены эти макросы, поскольку до того, как С++ был стандартизирован, но поскольку они, очевидно, играют хаос со стандартной библиотекой С++, можно определить макрос NOMINMAX
, чтобы предотвратить их определение.
Как правило, если вы используете С++ (в отличие от C) и включаете windows.h
, сначала сначала определяйте NOMINMAX
.
Ответ 2
Если вы используете VС++, вы можете использовать #define NOMINMAX
до включения любых заголовков или сделать (std::max)(myInt + 2 * border, myOtherInt + 2 * border)
Ответ 3
Я бы сказал, что либо max
есть #define
для чего-то другого, либо вам нужно явно вызвать шаблон через std::max<int>
.
Ответ 4
Объявление "using" (см. с использованием Декларации) - это еще один способ обойти эту проблему:
int border = 35;
int myInt = 2;
int myOtherInt = 3;
using std::max;
int z = max(myInt + 2 * border, myOtherInt + 2 * border);
Он позволяет использовать std:: max без явной квалификации.
Ответ 5
Вы пытались использовать ::std::max
вместо этого? Если это не сработает, что-то возится с вашим пространством имен std.