2010-11-24 14 views
5

के साथ समस्या यह क्यों काम नहीं करती है? त्रुटि 1 त्रुटि C2057:numeric_limits

enum : long {MaxValue = std::numeric_limits<long int>::max()}; 

मैं त्रुटि मिल रही है उम्मीद निरंतर अभिव्यक्ति
क्या इसके बारे में स्थिर नहीं है? लंबी int की सीमा संकलन समय पर ज्ञात है तो समस्या क्या है?

+0

'स्थिर constexpr टी अधिकतम(); // (सी ++ 11 के बाद से) '... लेकिन यह विजुअल स्टूडियो 2012 (अभी भी C2057 देता है) में एक संकलन-समय स्थिर के रूप में काम नहीं करता है, भले ही वीएस 2012 बहुत सी ++ 11 सुविधाओं का समर्थन करता है। –

उत्तर

5

समस्या यह है कि यह रन-टाइम में कहा जाता है हालांकि std::numeric_limits<long int>::max() समारोह निरंतर मान देता है और आप संकलन समय में निरंतर मूल्य की जरूरत है

शायद तुम सिर्फ बजाय LONG_MAX मूल्य उपयोग कर सकते हैं (climits हैडर देखें) है?

+0

आपके उत्तर +1 के लिए धन्यवाद। क्या इस अजीब व्यवहार को दूर करने के लिए कोई (कानूनी) तरीका है? –

+3

सी ++ 0 एक्स 'कॉन्स्टेक्सप्र' पेश करता है जो इस तरह के मुद्दों को हल करने में मदद करेगा – icecrime

+3

बूस्ट में 'const_min' और' const_max' सदस्यों के साथ 'boost :: integer_traits' क्लास टेम्पलेट भी है। – Philipp

1

हां, लेकिन संकलन समय पर एक फ़ंक्शन निष्पादित नहीं किया जा सकता है। max()

+0

देखें। http://en.wikipedia.org/wiki/Compile_time_function_execution। शायद जीसीसी सीटीएफई का समर्थन नहीं करता है, लेकिन - इस संदर्भ में, अधिकतम() सबसे अधिक संभावना है, और निरंतर लौटाता है, इसलिए संकलन समय पर जीसीसी द्वारा इसका मूल्यांकन किया जा सकता है। –

3

जैसा कि दूसरे ने कहा है, आपको निरंतर अभिव्यक्ति की आवश्यकता है (कार्य योग्य नहीं हैं)। आखिरकार सी ++ 1 एक्स कार्यों सहित निरंतर अभिव्यक्तियों की एक विस्तृत श्रृंखला का समर्थन करेगा। n2235 और बजेर्न स्ट्राउस्ट्रप के FAQ entry देखें।

संबंधित मुद्दे