2014-12-12 10 views
20

Ich habe struct Definition Klasse wie folgt:Syntaxfehler mit std :: numeric_limits :: max

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

Das Problem ist, dass ich nicht 'std :: numeric_limits :: max()' verwenden können, und der Compiler sagt :

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

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

Der Compiler, die ich verwende ist Visual C++ 11 (2012)

+0

Kann nicht reproduzieren. Versuchen Sie, '' einzuschließen. –

+0

@ ParkYoung-Bae Ich verwende keine Std für size_t in meinem Code. Soll ich das tun? – mmostajab

+0

@remyabel Welchen Compiler benutzen Sie? Ich bin mit Visual C++ 11 (2012) – mmostajab

Antwort

45

Ihr Problem ist höchstwahrscheinlich durch <Windows.h> Header-Datei verursacht, die ihre eigenen Makros max und min Namen definiert.

Als Abhilfe können Sie entweder #undef max vor dem Aufruf numeric_limits<size_t>::max():

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

oder das Gespräch mit Klammern wickeln (die Makroerweiterung verhindert):

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

Wie andere Leute das Problem sagen dass in <WinDefs.h> (enthalten durch <windows.h>) Makros min und max definiert ist, aber wenn Sie sehen, ist es Erklärung:

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

Sie sehen, dass, wenn ein Makro NOMINMAX definiert ist, WinDefs.h diese Makros nicht erzeugt.

Deshalb wäre es besser, ein NOMINMAX hinzuzufügen definieren zu projizieren.

Verwandte Themen