2014-12-12 28 views
20

Sınıf yapı tanımı var:sözdizimi hatası :: 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]; 
}; 

Sorun 'std :: numeric_limits :: max()' kullanamazsınız ve derleyici diyor :

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

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

kullanıyorum derleyici Görsel C++ 11 (2012)

+0

Yeniden üretilemiyor. 'yi dahil etmeyi deneyin. –

+0

@ ParkYoung-Bae Kodumda size_t için std kullanmıyorum. Bunu yapmalı mıyım? – mmostajab

+0

@remyabel Hangi derleyiciyi kullanıyorsunuz? Visual C++ 11 (2012) – mmostajab

cevap

45

Sorununuza büyük olasılıkla, max ve min adlı kendi makrolarını tanımlayan <Windows.h> başlık dosyasından kaynaklanıyor. Geçici bir çözüm olarak

, #undef max numeric_limits<size_t>::max() çağırmadan önce ya edebilirsiniz:

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

veya parantez çağrıyı sarın (makro genişleme önler): Başkalarının söylediği gibi

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

sorundur <WinDefs.h> (<windows.h> tarafından sağlanan), min ve max makroları olarak tanımlanmıştır, ancak bunun göründüğünü görürseniz:

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

Bir makro NOMINMAX tanımlıysa, WinDefs.h bu makroları üretmeyeceğini görürsünüz.

Bu nedenle, NOMINMAX tanımını projeye eklemek daha iyi olur.