web-dev-qa-db-fra.com

Erreur de syntaxe avec std :: numeric_limits :: max

J'ai la définition de structure de classe comme suit:

#include <limits>

struct heapStatsFilters
{
    heapStatsFilters(size_t minValue_ = 0, size_t maxValue_ = std::numeric_limits<size_t>::max())
    { 
         minMax[0] = minValue_; minMax[1] = maxValue_; 
    }

    size_t minMax[2];
};

Le problème est que je ne peux pas utiliser 'std :: numeric_limits :: max ()' et le compilateur dit:

Error 8 error C2059: syntax error : '::'

Error 7 error C2589: '(' : illegal token on right side of '::'

Le compilateur que j'utilise est Visual C++ 11 (2012)

36
mmostajab

Votre problème est dû au fichier d'en-tête <Windows.h> Qui inclut des définitions de macro nommées max et min:

#define max(a,b) (((a) > (b)) ? (a) : (b))

En voyant cette définition, le préprocesseur remplace l'identifiant max dans l'expression:

std::numeric_limits<size_t>::max()

par la définition de la macro, conduisant finalement à une syntaxe non valide:

std::numeric_limits<size_t>::(((a) > (b)) ? (a) : (b))

signalé dans l'erreur du compilateur: '(' : illegal token on right side of '::'.

Comme solution de contournement, vous pouvez ajouter la définition de NOMINMAX aux indicateurs du compilateur (ou à l'unité de traduction, avant d'inclure l'en-tête):

#define NOMINMAX   

ou encapsulez l'appel à max avec des parenthèses, ce qui empêche l'expansion de la macro:

size_t maxValue_ = (std::numeric_limits<size_t>::max)()
//                 ^                                ^

ou #undef max avant d'appeler numeric_limits<size_t>::max():

#undef max
...
size_t maxValue_ = std::numeric_limits<size_t>::max()
83
Piotr Skotnicki

Comme d'autres le disent, le problème est qu'en <WinDefs.h> (inclus par <windows.h>) est défini macroses min et max, mais si vous voyez sa déclaration:

// <WinDefs.h>
#ifndef NOMINMAX

#ifndef max
#define max(a,b)            (((a) > (b)) ? (a) : (b))
#endif

#ifndef min
#define min(a,b)            (((a) < (b)) ? (a) : (b))
#endif

#endif  /* NOMINMAX */

vous verrez que si une macro est définie NOMINMAX alors WinDefs.h ne produira pas ces macroses.

C'est pourquoi il serait préférable d'ajouter un définir NOMINMAX au projet.

8
borisbn