#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 : '::'
Le windows.h
fichier d'en-tête (ou plus correctement, windef.h
qu'il inclut à son tour) a des macros pour min
et max
qui interfèrent.
Vous devriez #define NOMINMAX
avant de l'inclure.
Pas besoin de définir quoi que ce soit, contournez simplement la macro en utilisant cette syntaxe:
(std::min)(a, b); // added parentheses around function name
(std::max)(a, b);
Comme d'autres l'ont mentionné, les erreurs sont dues aux macros min/max 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, il s'agit généralement d'une mauvaise technique de définition des 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 voulez expédier vos sources, vous devez avertir les utilisateurs de faire de même;
3) Définissez simplement les macros dans votre code avant de les utiliser
#undef min
#undef max
C'est probablement la solution la plus portable et flexible.
J'ai parfois 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 rend parfois le type explicite comme ceci:
int k = std::min<int>(3, 4);
Cela empêche également le préprocesseur de correspondre à min
et est sans doute plus lisible que la solution de contournement entre parenthèses.
Essayez quelque chose comme ceci:
#define NOMINMAX
#include <windows.h>
Par défaut, windows.h définit min
et max
comme macros. Lorsque ceux-ci sont développés, le code qui essaie d'utiliser std::min
(Par exemple) finira par ressembler à ceci:
int k = std::(x) < (y) ? (x) : (y);
Le message d'erreur vous indique que std::(x)
n'est pas autorisé.
Dans mon cas, le projet ne comprenait pas windows.h
ou windef.h
explicitement. Il utilisait Boost. J'ai donc résolu le problème en accédant au projet Properties -> C/C++ -> Preprocessor
, et en ajoutant NOMINMAX
dans le Preprocessor Definitions
(VS 2013, VS 2015).
#define NOMINMAX
est l'astuce pour supprimer les définitions de macro de max et min
Pour les personnes incluant windows.h, mettez les éléments suivants dans les en-têtes effectués:
#include windows headers ...
pragma Push_macro("min")
pragma Push_macro("max")
#undef min
#undef max
#include headers expecting std::min/std::max ...
...
pragma pop_macro("min")
pragma pop_macro("max")
Dans les fichiers source, juste #undef min et max.
#include windows headers ...
#undef min
#undef max
#include headers expecting std::min/std::max ...
Je suppose que windows.h définit min comme une macro, par exemple comme
#define min(a,b) ((a < b) ? a : b)
Cela expliquerait le message d'erreur.