I have class struct definition as follows:
#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];
};
The problem is that I cannot use 'std::numeric_limits::max()' and the compiler says:
Error 8 error C2059: syntax error : '::'
Error 7 error C2589: '(' : illegal token on right side of '::'
The compiler which I am using is Visual C++ 11 (2012)
As other people say the problem is that in
<WinDefs.h>
(included by<windows.h>
) is defined macrosesmin
andmax
, but if you'll see it's declaration:you'll see that if there is defined a macro
NOMINMAX
thenWinDefs.h
will not produce these macroses.That's why it would be better to add a define
NOMINMAX
to project.Your problem is caused by the
<Windows.h>
header file that includes macro definitions namedmax
andmin
:Seeing this definition, the preprocessor replaces the
max
identifier in the expression:by the macro definition, eventually leading to invalid syntax:
reported in the compiler error:
'(' : illegal token on right side of '::'
.As a workaround, you can add the
NOMINMAX
define to compiler flags (or to the translation unit, before including the header):or wrap the call to
max
with parenthesis, which prevents the macro expansion:or
#undef max
before callingnumeric_limits<size_t>::max()
: