2011-11-09 14 views
16

एक प्रकार का एक स्थिर क्षेत्र है कि वर्ग परिभाषा के समय अधूरा सी में कानूनी है की घोषणा है ++?एक अधूरी प्रकार के स्टेटिक क्षेत्र - यह कानूनी है?

Foo.h:

class Foo 
{ 
public: 
    // ... 
private: 
    class Bar; 
    static Bar something; 
}; 

Foo.cpp: उदाहरण के लिए

class Foo::Bar 
{ 
    // ... 
}; 

Foo::Bar Foo::something; 

// some more code 

संकलनकर्ता इसे स्वीकार करने लगता है, और मैं एक कारण नहीं दिख रहा है, जिसके लिए यह होना चाहिए खारिज कर दिया, लेकिन इस तरह की स्थिति के बारे में मानक क्या कहता है? मैं वास्तव में मानक से प्रत्यक्ष उद्धरण देने वाले किसी की सराहना करता हूं, अधिमानतः "पुराने" (2003 से एक) से।

उत्तर

13

हां, आप जो कर रहे हैं उसे विशेष रूप से अनुमति दी गई है (§9.4.2/2): "अपनी कक्षा परिभाषा में एक स्थिर डेटा सदस्य की घोषणा परिभाषा नहीं है और यह एक अपूर्ण प्रकार का हो सकता है जो सीवी- योग्य शून्य। "

2

मैं मानक से उद्धृत नहीं कर सकता, लेकिन मैं आपको सलाह "एक संकलक की तरह लगता है कि" करने के लिए दे सकते हैं।

मुद्दा यह है कि आप something घोषणा कर रहे है, क्या संकलक जरूरत प्रकार के बारे में पता करने के लिए करता है? यदि यह एक सामान्य सदस्य था तो उसे आकार जानने की आवश्यकता होगी ताकि इसे कक्षा परिभाषा में शामिल किया जा सके, लेकिन यह स्थिर सदस्यों के लिए सच नहीं है क्योंकि उनका संग्रहण वर्ग का हिस्सा नहीं है। इसे जानने के लिए इसे जानने की आवश्यकता नहीं है क्योंकि इसे कक्षा निर्माण के हिस्से के रूप में नहीं बनाया जाएगा। वहाँ वास्तव में कुछ संकलक समय यह घोषणा की है कि स्थिर वर्ग के बारे में पता करने की जरूरत है नहीं है, तो एक आगे घोषणा बस ठीक काम करता है।

+1

हाँ। यही कारण है कि मैंने कहा "मुझे कोई कारण नहीं दिख रहा है जिसके लिए इसे अस्वीकार किया जाना चाहिए"। मैं आपके द्वारा लिखी गई चीज़ों को जानता हूं, मुझे यकीन नहीं था कि मानक किसी कारण से कोड को अस्वीकार नहीं करता है (यह सी ++ है, आप कभी भी सुनिश्चित नहीं हो सकते हैं), यही कारण है कि मैं प्रत्यक्ष उद्धरण चाहता था। इसके अलावा, मुझे अपना पहला प्रश्न यहां पूछना पड़ा;) – Fanael

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