web-dev-qa-db-fra.com

std :: min donne une erreur

#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 : '::'
95
hidayat

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.

139
paxdiablo

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);
74
PolyMesh

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.

24
Gene Bushuyev

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.

17
Erik

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é.

15
Jerry Coffin

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).

4
Terry
#define NOMINMAX

est l'astuce pour supprimer les définitions de macro de max et min

http://support.Microsoft.com/kb/143208

2
Foo Bah

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 ...
2
user2249683

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.

1
sstn