#include <algorithm>
#include <Windows.h>
int main()
{
int k = std::min(3, 4);
return 0;
}
Que fait Windows si j'inclus Windows.h? Je ne peux pas utiliser std::min
dans Visual Studio 2005. Le message d'erreur est:
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
c++
visual-studio-2005
hidayat
la source
la source
Réponses:
Le
windows.h
fichier d'en-tête (ou plus correctement,windef.h
qu'il inclut à son tour) a des macros pourmin
etmax
qui interfèrent.Vous devriez
#define NOMINMAX
avant de l'inclure.la source
Pas besoin de définir quoi que ce soit, contournez simplement la macro en utilisant cette syntaxe:
la source
min
oumax
(exemple de cas d'utilisation: implémentation d'une classe qui s'inscrit dans le concept UniformRandomNumberGenerator ).Comme d'autres l'ont mentionné, les erreurs sont dues aux macros min / max qui sont définies dans les en-têtes Windows. Il existe trois façons de les désactiver.
1)
#define NOMINMAX
avant d'inclure l'en-tête, c'est généralement une mauvaise technique de définition de macros afin d'affecter les en-têtes suivants;2) définir
NOMINMAX
dans la ligne de commande du compilateur / IDE. Le mauvais côté de cette décision est que si vous souhaitez expédier vos sources, vous devez avertir les utilisateurs de faire de même;3) Annulez simplement les macros dans votre code avant qu'elles ne soient utilisées
C'est probablement la solution la plus portable et la plus flexible.
la source
J'ai encore des problèmes avec les en-têtes Windows et la définition de NOMINMAX à l'échelle du projet ne semble pas toujours fonctionner. Au lieu d'utiliser des parenthèses, je rends parfois le type explicite comme ceci:
Cela empêche également le préprocesseur de correspondre à
min
et est sans doute plus lisible que la solution de contournement entre parenthèses.la source
Essayez quelque chose comme ceci:
Par défaut, windows.h définit
min
et enmax
tant que macros. Lorsque ceux-ci sont développés, le code qui essaie d'utiliserstd::min
(par exemple) finira par ressembler à ceci:Le message d'erreur vous indique que ce
std::(x)
n'est pas autorisé.la source
Dans mon cas, le projet n'a pas inclus
windows.h
ouwindef.h
explicitement. Il utilisait Boost. J'ai donc résolu le problème en accédant au projetProperties -> C/C++ -> Preprocessor
et en ajoutantNOMINMAX
dans lePreprocessor Definitions
(VS 2013, VS 2015).la source
Pour les personnes incluant windows.h, mettez ce qui suit dans les en-têtes affectés:
Dans les fichiers source, juste #undef min et max.
la source
est l'astuce pour supprimer les définitions de macro de max et min
http://support.microsoft.com/kb/143208
la source
Pour résoudre ce problème, je crée simplement un fichier d'en-tête nommé
fix_minmax.h
sans inclure les gardesL'utilisation de base est comme ça.
L'avantage de cette approche est qu'elle fonctionne avec chaque type de fichier inclus ou partie de code. Cela vous fait également gagner du temps lorsque vous traitez du code ou des bibliothèques qui dépendent de
min
/max
macrosla source
Je suppose que windows.h définit min comme une macro, par exemple comme
Cela expliquerait le message d'erreur.
la source