#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
Что будут делать окна, если я включу Windows.h? Я не могу использовать std::min
в Visual Studio 2005. Сообщение об ошибке:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
c++
visual-studio-2005
хидайят
источник
источник
Ответы:
windows.h
Заголовка файла (или более правильно,windef.h
что она включает в себя , в свою очередь) имеет макросыmin
иmax
которые мешают.Вы должны
#define NOMINMAX
перед его включением.источник
Не нужно ничего определять, просто пропустите макрос, используя этот синтаксис:
источник
min
илиmax
(пример использования: реализация класса, который вписывается в концепцию UniformRandomNumberGenerator ).Как уже упоминалось, ошибки связаны с макросами min / max, которые определены в заголовках Windows. Есть три способа отключить их.
1)
#define NOMINMAX
перед включением заголовка это обычно плохой метод определения макросов, чтобы повлиять на следующие заголовки;2) определить
NOMINMAX
в командной строке компилятора / IDE. Плохая часть этого решения состоит в том, что если вы хотите отправить свои источники, вам нужно предупредить пользователей, чтобы они сделали то же самое;3) просто отмените определение макросов в своем коде перед их использованием
Это, наверное, самое портативное и гибкое решение.
источник
Иногда у меня все еще возникают проблемы с заголовками окон, и широкое определение NOMINMAX не всегда работает. В качестве альтернативы круглым скобкам я иногда делаю тип явным:
Это также предотвращает сопоставление препроцессора с
min
и, возможно, более читабельно, чем обходной путь в круглых скобках.источник
Попробуйте что-то вроде этого:
По умолчанию windows.h определяет
min
иmax
как макросы. Когда они расширяются, код, который пытается использоватьstd::min
(например), в конечном итоге будет выглядеть примерно так:Сообщение об ошибке сообщает вам, что
std::(x)
это запрещено.источник
В моем случае проект не был включен
windows.h
илиwindef.h
явно. Он использовал Boost. Итак, я решил проблему, перейдя в проектProperties -> C/C++ -> Preprocessor
и добавивNOMINMAX
вPreprocessor Definitions
(VS 2013, VS 2015).источник
Для людей, использующих windows.h, вставьте в обработанные заголовки следующее:
В исходных файлах просто #undef min и max.
источник
это трюк для подавления макроопределений max и min
http://support.microsoft.com/kb/143208
источник
Чтобы решить эту проблему, я просто создаю файл заголовка с именем
fix_minmax.h
без включения охранников.Основное использование похоже на это.
Плюсы этого подхода в том, что он работает со всеми типами включаемых файлов или частей кода. Это также экономит ваше время при работе с кодом или библиотеками, которые зависят от
min
/max
macros.источник
Я предполагаю, что windows.h действительно определяет min как макрос, например как
Это объяснило бы сообщение об ошибке.
источник