j'ai récemment ajouté:
#define NOMINMAX
#include <Windows.h>
#include <algorithm>
à mon main.cpp afin d'utiliser
std::max( x , x ); // x is just a placeholder and not actual anything
std::min( x , x );
mais je ne peux pas utiliser std::max()/std::min()
dans d'autres fichiers.
error C2589: '(' : illegal token on right side of '::'
error C2059: syntax error : '::'
j'ai essayé d'ajouter #define NOMINMAX
dans mes autres fichiers, mais échoue. quel est l'indice?
j'ai regardé autour avant de demander, mais je ne comprends pas la réponse Problèmes possibles avec NOMINMAX sur Visual C++
Si vous êtes vraiment désespéré, mettez des parenthèses autour des noms de fonction:
(std::min)(x, y);
Cette syntaxe n'appliquera pas de macro de type fonction. (Formellement, pour appliquer une macro de type fonction, le nom de la macro doit être suivi d'un espace blanc facultatif, puis d'un '('.)
Définissez NOMINMAX
via un drapeau de compilation:
> cl.exe -DNOMINMAX ...
cela sera alors défini pour tous les fichiers source. Je n'utilise pas les IDE mais cette page fournit des conseils sur la navigation dans le IDE pour définir ceci: L'utilisation de STL dans le programme Windows peut provoquer des conflits min/max :
Définissez simplement le symbole du préprocesseur NOMINMAX. Cela peut être fait dans le projet Developer Studio sous Build, Settings, sous l'onglet C/C++, dans la catégorie Preprocessor. Cela supprimera les définitions min et max dans Windef.h.
Si vous définissez NOMINMAX, car vous préférez la version STL, vous pouvez rencontrer des problèmes lors de l'inclusion de gdiplus.h, qui utilise la macro min/max. Comme solution, vous devez inclure les en-têtes STL et utiliser "using namespace std" before vous incluez le gdiplus.h.
Par exemple:
#define NOMINMAX
// Include C++ headers
#include <algorithm>
using namespace std;
// Include Windows headers
#include <windows.h>
#include <gdiplus.h>
Il est probable que votre problème soit que vous #define NOMINMAX
Après Vous #include "windows.h"
. Il est important que le #define
viens en premier.
La raison en est que windows.h (en fait je pense que windef.h, qui est inclus par windows.h) a un code similaire à ceci:
#ifndef NOMINMAX
#define min(x,y) ((x) < (y) ? (x) : (y))
#define max(x,y) ((x) > (y) ? (x) : (y))
#endif
Donc #define NOMINMAX
indique au compilateur (ou en fait au préprocesseur) de sauter les définitions de min
et max
, mais cela ne s'appliquera que si vous le faites avant de vous #include "windows.h"
.