59 votes

avertissement C4003 et erreurs C2589 et C2059 sur: x = std :: numeric_limits <int> :: max ();

Cette ligne fonctionne correctement dans un petit programme de test, mais dans le programme pour lequel je le souhaite, je reçois les plaintes suivantes du compilateur:

 #include <limits>

x = std::numeric_limits<int>::max();

c:\...\x.cpp(192) : warning C4003: not enough actual parameters for macro 'max'
c:\...\x.cpp(192) : error C2589: '(' : illegal token on right side of '::'
c:\...\x.cpp(192) : error C2059: syntax error : '::'
 

J'obtiens les mêmes résultats avec:

 #include <limits>
using namespace std;

x = numeric_limits<int>::max();
 

Pourquoi voit-il max comme la macro max (a, b); ?

76voto

Steve Guidi Points 8831

Cela se produit généralement lorsque incluant un en-tête Windows qui définit un min ou max macro. Si vous utilisez Windows les en-têtes de, mettre des #define NOMINMAX dans votre code, ou de construire avec l'équivalent de commutateur de compilateur (c'est à dire utiliser /DNOMINMAX pour Visual Studio).

Notez que la construction avec NOMINMAX désactive l'utilisation de la macro dans l'ensemble de votre programme. Si vous avez besoin d'utiliser l' min ou max des opérations, utilisez std::min() ou std::max() de la <algorithm> - tête.

68voto

denis-bu Points 1361

Une autre solution consisterait à envelopper le nom de la fonction avec des parenthèses telles que: (std::numeric_limits<int>::max)() . Même chose pour std::max .

Pas sûr que ce soit une bonne solution pour cela ... NOMINMAX est une meilleure OMI, mais cela pourrait être une option dans certains cas.

27voto

R Samuel Klatchko Points 44549

Un autre fichier d'en-tête pollue l'espace de noms global avec une macro max. Vous pouvez résoudre ce problème en dé-définissant la macro:

 #undef max
x = std::numeric_limits<int>::max();
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X