2012-05-31 16 views
7

मेरा Test कक्षा में conststatic उप-प्रकार का सदस्य है। मैं आमतौर पर इस conststatic सदस्य को निम्नानुसार परिभाषित करता हूं।स्थिर कॉन्स सदस्य को कैसे परिभाषित किया जाए?

class Test 
{ 
public: 
    class Dummy {}; 

private: 
    static Dummy const dummy; 

}; 

Test::Dummy const Test::dummy;    // ERROR HERE 

int main() 
{ 
    return 0; 
} 

इस स्रोत को gcc-4.6 के साथ संकलित करते समय, यह कोई त्रुटि नहीं देता है और सही ढंग से संकलित करता है।

gcc-4.4 के साथ इस स्रोत को संकलित करते समय, यह निम्न त्रुटि देता है: error: uninitialized const ‘Test::dummy’ चिह्नित रेखा पर।

  • क्या इस स्थिर कॉन्स सदस्य चर को परिभाषित करने का कोई और तरीका है?
  • क्या यह जीसीसी-4.4 की सीमा है?
  • क्या कोई कामकाज है?
+2

'टेस्ट :: डमी स्थिरांक टेस्ट :: डमी = टेस्ट :: डमी (); ' – dasblinkenlight

उत्तर

6

कहते हैं:

Test::Dummy const Test::dummy = { }; 
+0

हालांकि जीसीसी 4.4 के साथ काम नहीं करेगा, या यह होगा? – bstamour

+1

जब तक 'टेस्ट :: डमी' कुल (सी ++ 03), या हमेशा सी ++ 11 में काम करना चाहिए। –

+0

आह सही, डमी एक पीओडी प्रकार है। – bstamour

1

आप भी class Dummy करने के लिए डिफ़ॉल्ट ctor जोड़ सकते हैं:

class Dummy { public: Dummy(){} }; 
लाइन में

4.

संपादित करें: ऐसा लगता है कि जीसीसी 4.4 में विफल रहता है कक्षा Dummy कक्षा के लिए डिफ़ॉल्ट ctor उत्पन्न करें। इस प्रकार उपरोक्त इस कंपाइलर बग को सीधे खत्म करता है।

+1

इसके लिए कोई ज़रूरत नहीं है, 'डमी' में एक कंपाइलर-संश्लेषित डिफ़ॉल्ट कन्स्ट्रक्टर है। – juanchopanza

+0

@juanchopanza अच्छी तरह से, जीसीसी 4.3.2 के तहत, उपर्युक्त समस्या * बिना किसी अन्य परिवर्तन के मूल कोड – Walter

+0

पर एक संकलक बग पर संकेत देता है ... – juanchopanza

0
जीसीसी 4.4 के साथ

,

Test::Dummy const Test::dummy = Test::Dummy; 

का उपयोग compilers सी ++ 11 समर्थन के साथ, आप एक समान आरंभीकरण सिंटैक्स का उपयोग कर सकते हैं:

Test::Dummy const Test::dummy = { }; 

लेकिन मुझे नहीं लगता कि जीसीसी 4.4 द्वारा समर्थित है या नहीं।

+0

आपका पहला समाधान जीसीसी 4.3.2 पर काम नहीं करता है, लेकिन दूसरा (ला लारेक एसबी) करता है। – Walter

+0

पहले व्यक्ति को 'टेस्ट :: डमी() '' टेस्ट :: डमी' का उपयोग नहीं करना चाहिए। दूसरे के लिए, वर्दी प्रारंभिक वाक्यविन्यास '=' i.e. के बिना होगा। टेस्ट :: डमी कॉन्स टेस्ट :: डमी {}; ' –

2

http://gcc.gnu.org/wiki/VerboseDiagnostics#uninitialized_const देखें (जो मानक के लिए प्रासंगिक संदर्भ देता है) और यह भी GCC 4.6 release notes जो कहते हैं कि

In 4.6.0 and 4.6.1 G++ no longer allows objects of const-qualified type to be default initialized unless the type has a user-declared default constructor. In 4.6.2 G++ implements the proposed resolution of DR 253 , so default initialization is allowed if it initializes all subobjects. Code that fails to compile can be fixed by providing an initializer e.g.

struct A { A(); }; 
struct B : A { int i; }; 
const B b = B(); 

Use -fpermissive to allow the old, non-conforming behaviour.

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