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 max
en min
:
#define max(a,b) (((a) > (b)) ? (a) : (b))
Als je deze definitie ziet, vervangt de preprocessor de max
identifier 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 max
tussen haakjes, waardoor de macro-uitbreiding wordt voorkomen:
size_t maxValue_ = (std::numeric_limits<size_t>::max)()
// ^ ^
of #undef max
voordat 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 min
en 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.h
deze macro’s niet zal produceren.
Daarom is het beter om een gedefinieerde NOMINMAX
toe te voegen aan het project.