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

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: синтаксическая ошибка: '::'

Что не так?

4b9b3361

Ответ 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.