2015-04-03 9 views
18

मैं इस कोड को संकलित करने का प्रयास कर रहा हूं, लेकिन g ++ ZERO के बारे में शिकायत करता है जिसमें अपूर्ण प्रकार है। क्या इसका मतलब यह है कि सी ++ में एक स्ट्रक्चर में static constexpr स्वयं का उदाहरण नहीं हो सकता है? यदि हां, तो क्यों?सी ++ स्थैतिक कंस्ट्रैक्स फ़ील्ड अपूर्ण प्रकार

struct Cursor 
{ 
    size_t row,column; 

    static constexpr Cursor ZERO {0,0}; 
    //error: constexpr const Cursor Cursor::ZERO has incomplete type 
}; 

संपादित करें: मैं समझता हूँ कि Cursor जब मैं ZERO घोषित एक पूरा प्रकार नहीं कर सकते हैं। मैं क्या जानना चाहता हूं: क्या ZEROCursor से संबंधित कोई भी तरीका है और अभी भी constexpr है?

+0

आप कर सकते थे त्रुटि संदेश प्रदान करें? –

+2

मुझे संदेह है कि यह constexpr और इनलाइन प्रारंभ के कारण है। – Quentin

+0

कक्षा घोषणा के बाहर प्रारंभिक स्थानांतरित करें। –

उत्तर

12

दुर्भाग्यवश, आप बस यह नहीं कर सकते!

कुछ static constexpr सदस्यों इनलाइन initialised जा सकता है:

[C++11 9.4.2/3]:[..] शाब्दिक प्रकार का एक static डेटा सदस्य constexpr विनिर्देशक साथ वर्ग परिभाषा घोषित किया जा सकता; यदि हां, तो इसकी घोषणा ब्रेस-या-बराबर-प्रारंभकर्ता निर्दिष्ट करेगी जिसमें प्रत्येक प्रारंभकर्ता-खंड जो असाइनमेंट-अभिव्यक्ति एक निरंतर अभिव्यक्ति है। [..]

Cursor एक शाब्दिक प्रकार है, इसलिए इस गिना जाता है।

और अपने स्वयं के प्रकार के अंतर्गत एक static डेटा सदस्य के रूप में Cursor के ही उपयोग करते हैं, एक समस्या नहीं है जब तक आप शाब्दिक नाम स्थान दायरे में यह आरंभ के रूप में:

[C++11: 9.4.2/2]:एक static डेटा सदस्य की घोषणा इसकी कक्षा परिभाषा में परिभाषा नहीं है और सीवी-योग्य शून्य के अलावा एक अधूरा प्रकार हो सकता है। static डेटा सदस्य की परिभाषा सदस्य की श्रेणी परिभाषा को संलग्न करने वाले नामस्थान क्षेत्र में दिखाई देगी। नेमस्पेस स्कोप की परिभाषा में, static डेटा सदस्य का नाम :: ऑपरेटर का उपयोग करके अपने वर्ग के नाम से योग्य होगा। प्रारंभकर्ताstatic डेटा सदस्य की परिभाषा में अभिव्यक्ति इसकी कक्षा (3.3.7) के दायरे में है।

लेकिन आपको लगता है कि constexpr साथ नहीं कर सकते:

[C++11: 7.1.5/9]: एक constexpr विनिर्देशक एक वस्तु घोषणा में प्रयोग किया जाता const के रूप में वस्तु की घोषणा की। इस तरह के एक वस्तु का शाब्दिक प्रकार होगा और इसे शुरू किया जाएगा। [..]

मैं इस शब्दों के सभी सुधार किया जा सकता लगता है लेकिन, इस बीच, मुझे लगता है कि आप ZERO संलग्नित नाम स्थान में एक गैर सदस्य बनाने के लिए करने जा रहे हैं।

+2

इस पूरे उत्तर के लिए धन्यवाद। यह देखते हुए कि कर्सर वास्तव में कक्षा वीजीए के अंदर परिभाषित किया गया है, मैं सिर्फ शून्य को वीजीए का एक स्थिर कॉन्स्टेक्स सदस्य बना दूंगा। कभी-कभी मुझे कुछ प्रतिबंध बहुत परेशान लगता है ... – lodo

5

क्या कोई तरीका है कि मैं शून्य से कर्सर से संबंधित हो सकता हूं और अभी भी constexpr है?

हाँ, अगर आप के रूप में नेस्ट उपवर्गों गिनती "से संबंधित" युक्त वर्ग:

struct Cursor 
{ 
    size_t row,column; 

    struct Constants; 
}; 

struct Cursor::Constants 
{ 
    static constexpr Cursor ZERO {0,0}; 
}; 
3

यदि आप स्वीकार कर सकते हैं एक समारोह, के लिए नहीं एक चर

struct Cursor 
{ 
    size_t row,column; 

    static constexpr Cursor ZERO() { return Cursor{0,0}; } 
}; 
संबंधित मुद्दे