6

कुछ कोड संकलित करते समय मैंने एक संकलक त्रुटि में भाग लिया जो मुझे अजीब लग रहा था और विरासत, नेस्टेड कक्षाओं, घोषणाओं का उपयोग करके, और संशोधक संशोधक से संबंधित है।घोषणापत्र और एक्सेस संशोधक का उपयोग करके नेस्टेड क्लास

असल में, इरादा एक व्युत्पन्न प्रकार के लिए आधार प्रकार के घोंसला संरक्षित वर्ग का पर्दाफाश करने के लिए है।

कम उदाहरण निम्न समस्या प्रदर्शित करने के लिए:

class Base 
{ 
protected: 

    struct Nested 
    { 
     enum value_enum 
     { 
      val = 0, 
      val2, 
      val3 
     }; 
    }; 

}; 

class Derived : public Base 
{ 
public: 

    using Base::Nested; 
}; 


int main(int argc, char** argv) 
{ 
    //Base::Nested aa; // error, as (I) expected 
    //Base::Nested::value_enum ab; // error, as (I) expected 

    Derived::Nested ba; // works, as (I) expected 
    Derived::Nested::value_enum bb; // MSVC error, as (I) did not expect 


    return 0; 
} 

live देखें।

MSVC11 (v11.00.61030) निम्न त्रुटि के साथ इस कोड पर chokes:

error C2248: 'Base::Nested' : cannot access protected struct declared in class 'Base'

दोनों जीसीसी और बजना ठीक से इस संकलन, मानक से प्रासंगिक भागों उद्धृत करने की क्षमता के बिना तो, मैं तर्क है यह एक एमएसवीसी बग है।

क्या एमएसवीसी के साथ इसके आसपास कोई रास्ता है?

+0

मैं संकलन समय पर एक त्रुटि हो रही है लगता है कि बाद की समस्याओं के लिए में चल रहा से बेहतर है। –

+1

इसके संरक्षित होने के बाद, मानक मुख्य फ़ंक्शन द्वारा इसे –

+3

@AliKazmi तक सुरक्षित नहीं किया जा सकता है संरक्षित क्या है? 'व्युत्पन्न 'नेस्टेड के लिए एक्सेस संशोधक को बदलता है; यह इस मामले में संरक्षित नहीं है। साथ ही, 'Nest_enum'' नेस्टेड 'के अंदर सुरक्षित नहीं है। – namezero

उत्तर

1

MSVC के लिए निम्न वैकल्पिक हल काम करता है:

class Derived : public Base 
{ 
    public: 

    using Base::Nested; 
    typedef Base::Nested::value_enum value_enum; // add this 
}; 

int main(int argc, char** argv) 
{ 
    //Base::Nested aa; // error, as (I) expected 
    //Base::Nested::value_enum ab; // error, as (I) expected 

    Derived::Nested ba; // works, as (I) expected 
    Derived::value_enum bb = Derived::value_enum::val; // now works in MSVC 


    return 0; 
} 
संबंधित मुद्दे