Syntaxisfout met std::numeric_limits::max

Ik heb een class struct-definitie als volgt:

#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];
};

Het probleem is dat ik ‘std::numeric_limits::max()’ niet kan gebruiken en de compiler zegt:

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

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

De compiler die ik gebruik is Visual C++ 11 (2012)


Antwoord 1, autoriteit 100%

Uw probleem wordt veroorzaakt door het <windows.h>-headerbestand met macrodefinities met de namen maxen min:

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

Als je deze definitie ziet, vervangt de preprocessor de maxidentifier in de uitdrukking:

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

volgens de macrodefinitie, wat uiteindelijk leidt tot ongeldige syntaxis:

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

gerapporteerd in de compilerfout: '(' : illegal token on right side of '::'.

Als tijdelijke oplossing kunt u de NOMINMAX-definitie toevoegen aan compilervlaggen (of aan de vertaaleenheid, voordat u de koptekst opneemt):

#define NOMINMAX   

of stop de aanroep naar maxtussen haakjes, waardoor de macro-uitbreiding wordt voorkomen:

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

of #undef maxvoordat u numeric_limits<size_t>::max()aanroept:

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

Antwoord 2, autoriteit 7%

Zoals andere mensen zeggen, is het probleem dat in <WinDefs.h>(opgenomen in <windows.h>) macro’s zijn gedefinieerd minen max, maar als je de verklaring ziet:

// <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 */

je zult zien dat als er een macro is gedefinieerd NOMINMAX, WinDefs.hdeze macro’s niet zal produceren.

Daarom is het beter om een ​​gedefinieerde NOMINMAXtoe te voegen aan het project.

Other episodes