#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
O que o Windows fará se eu incluir o Windows.h? Não consigo usar std::min
no Visual Studio 2005. A mensagem de erro é:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
c++
visual-studio-2005
hidayat
fonte
fonte
Respostas:
O
windows.h
arquivo de cabeçalho (ou mais corretamente,windef.h
que inclui por sua vez) tem macros paramin
emax
que estão interferindo.Você deve
#define NOMINMAX
antes de incluí-lo.fonte
Não há necessidade de definir nada, apenas ignore a macro usando esta sintaxe:
fonte
min
oumax
(exemplo de caso de uso: implementação de uma classe que se encaixa no conceito UniformRandomNumberGenerator ).Como outros mencionaram, os erros são devido a macros mín / máx que são definidas no (s) cabeçalho (s) do Windows. Existem três maneiras de desativá-los.
1)
#define NOMINMAX
antes de incluir o cabeçalho, geralmente é uma técnica inadequada de definir macros para afetar os cabeçalhos a seguir;2) definir
NOMINMAX
na linha de comando / IDE do compilador. A parte ruim dessa decisão é que se você quiser enviar suas fontes, você precisa avisar os usuários para fazerem o mesmo;3) simplesmente cancele a definição das macros em seu código antes de serem usadas
Esta é provavelmente a solução mais portátil e flexível.
fonte
Ainda tenho problemas ocasionalmente com os cabeçalhos das janelas e a definição ampla do projeto NOMINMAX nem sempre parece funcionar. Como alternativa ao uso de parênteses, às vezes deixo o tipo explícito assim:
Isso também impede o pré-processador de corresponder
min
e é indiscutivelmente mais legível do que a solução alternativa entre parênteses.fonte
Experimente algo assim:
Por padrão, windows.h define
min
emax
como macros. Quando eles são expandidos, o código que tenta usarstd::min
(por exemplo) acabará parecendo algo assim:A mensagem de erro informa que isso
std::(x)
não é permitido.fonte
No meu caso, o projeto não incluiu
windows.h
ouwindef.h
explicitamente. Ele estava usando Boost. Então, resolvi o problema indo para o projetoProperties -> C/C++ -> Preprocessor
e anexandoNOMINMAX
noPreprocessor Definitions
(VS 2013, VS 2015).fonte
Para pessoas que incluem windows.h, coloque o seguinte nos cabeçalhos afetados:
Nos arquivos de origem, apenas #undef min e max.
fonte
é o truque para suprimir as definições de macro de máximo e mínimo
http://support.microsoft.com/kb/143208
fonte
Para resolver esse problema, acabei de criar um arquivo de cabeçalho chamado
fix_minmax.h
sem incluir guardasO uso básico é assim.
As vantagens dessa abordagem é que ela funciona com todo tipo de arquivo incluído ou parte do código. Isso também economiza seu tempo ao lidar com código ou bibliotecas que dependem de
min
/max
macrosfonte
Eu presumo que windows.h define min como uma macro, por exemplo, como
Isso explicaria a mensagem de erro.
fonte