2011-11-12 13 views
6

अगर मैं निम्नलिखित C++ 0x कोड को संकलित करने का प्रयास करें, मैं कोई त्रुटि मिलती है :एक ही कक्षा में स्थित खाके पैरामीटर के रूप में एक constexpr का उपयोग कर त्रुटि

test.cc:6:27: error: ‘static constexpr int bar::number()’ used before its definition 
test.cc:6:28: note: in template argument for type ‘int’ 

बजना 2.8 के साथ, त्रुटि संदेश है:

test.cc:6:20: error: non-type template argument of type 'int' is not an integral 
     constant expression 
     void function(foo<number()> &); 
          ^~~~~~~~ 
1 error generated. 

अगर मैं एक आधार ग constexpr समारोह के लिए कदम लड़की, यह जीसीसी पर काम करता है, और बजना पर एक ही त्रुटि संदेश देता है:

template<int n> struct foo { }; 

struct base { 
    static constexpr int number() { return 256; } 
}; 

struct bar : base { 
    void function(foo<number()> &); 
}; 

कोड गलत है, या यह एक सीमा या C++ 0x की जीसीसी 4.6 के कार्यान्वयन पर बग है? यदि कोड गलत है, तो यह गलत क्यों है, और सी ++ 11 मानक के कौन से खंड कहते हैं कि यह गलत है?

+2

हम्म .. मुझे लगता है कि हम सिर्फ चर्चा की इस पहले: इनलाइन समारोह परिभाषाओं व्यवहार कर रहे हैं जैसे कि वे परिभाषित किया गया * बस के बाद * वर्ग परिभाषा; तो कक्षा परिभाषा के अंदर वे अभी तक उपलब्ध नहीं हैं। ध्यान दें कि आप हमेशा 'स्थिर कॉन्स int संख्या = 256;' या 'स्थिर constexpr int संख्या = 256; 'इसके बजाय कह सकते हैं। –

+0

@ केरेकस्क बी ओह, मैं कभी नहीं जानता था। आपको इसे एक उत्तर के रूप में लिखना चाहिए। –

+0

@KerrekSB: AFAIK, यदि मैं 'स्थिर कॉन्स int संख्या = 256; 'का उपयोग करता हूं, तो मुझे' const int bar :: संख्या; 'की भी आवश्यकता होती है, जो' बेडा 'में 4 बेकार बाइट्स को अपर्याप्त रूप से जोड़ देगा। इनलाइन फ़ंक्शन का उपयोग करना इससे रोकता है। मुझे नहीं पता कि यह 'स्थैतिक constexpr int संख्या = 256;' के मामले में भी है, हालांकि। – CesarB

उत्तर

5

सी ++ में, कक्षा के लिए सदस्य कार्यों की इनलाइन परिभाषाओं को केवल कक्षा में हर घोषणा के बाद पार्स किया जाता है। इसलिए, आपके पहले उदाहरण में, संकलक number() की परिभाषा को उस बिंदु पर नहीं देख सकता जहां function() घोषित किया गया है।

(बजना का कोई संस्करण जारी constexpr कार्यों के मूल्यांकन के लिए समर्थन हासिल है, तो आपके testcases में से कोई भी वहाँ काम करेंगे।)

1

मैं निम्नलिखित कोड के साथ एक simillar त्रुटि मिल गया है:

struct Test{ 
    struct Sub{constexpr Sub(int i){}}; 
    static constexpr Sub s=0; 
}; 

"त्रुटि: 'constexpr टेस्ट :: सब :: उप (int)' जीसी 4.7.1 पर निरंतर अभिव्यक्ति में कहा जाता है। जबकि यह सफलतापूर्वक संकलन होगा:

struct Sub{constexpr Sub(int i){}}; 
struct Test{ 
    static constexpr Sub s=0; 
}; 
+4

अगर आप जो योगदान दे रहे हैं, तो कृपया केवल एक उत्तर दें * उत्तर * उपयोगकर्ता जो प्रश्न प्रस्तुत कर रहा है। जो आपने पोस्ट किया है उसे अधिक टिप्पणी माना जाता है, जिसे आप साइट का अधिक उपयोग करते समय पोस्ट करने का विशेषाधिकार प्राप्त करेंगे। एसओ में शामिल होने के लिए धन्यवाद और स्वागत करें। – David

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