2012-11-07 16 views
5

निम्नलिखित कोड विजुअल स्टूडियो 2005 में संकलन नहीं करता है:वर्कअराउंड 2005 सी ++ विरासत बग

class OriginalClass 
{ 
public: 
    class Delegate 
    { 
     virtual void original_func()=0; 
    }; 
}; 

class BaseClass 
    :public OriginalClass::Delegate // Problem line 1 
{ 
public: 
    class Delegate 
    { 
     virtual void base_func(int x) = 0; 
    }; 

    void original_func()override{} // Problem line 2 
}; 

class DerivedClass : public BaseClass::Delegate 
{ 
public: 
    virtual void base_func(int x) override {}; 
}; 

int main() 
{ 
    DerivedClass derived_object; 

    derived_object.base_func(10); 
} 

निर्माण उत्पादन होता है:

1>inherit\main.cpp(26) : error C3668: 'DerivedClass::base_func' : method with override specifier 'override' did not override any base class methods 
1>inherit\main.cpp(32) : error C2259: 'DerivedClass' : cannot instantiate abstract class 
1>  due to following members: 
1>  'void OriginalClass::Delegate::original_func(void)' : is abstract 
1>  inherit\main.cpp(7) : see declaration of 'OriginalClass::Delegate::original_func' 

अगर मैं बाहर टिप्पणी लाइनों चिह्नित समस्या रेखा 1 और समस्या रेखा 2 यह ठीक बनाता है। तो, का उपयोग ओवरराइड एक समस्या नहीं है, न ही नेस्टेड कक्षा से विरासत में है। ऐसा लगता है कि कौन सा प्रतिनिधि वर्ग उपयोग करने के लिए सही है, यह समझने में कठिनाई होती है।

यह समस्या VC2008 में मौजूद नहीं है।

क्या कोई इस के लिए एक समाधान सुझा सकता है? स्पष्ट के अलावा: आधुनिक कंपाइलर में अपग्रेड करें!

इसके अलावा, अगर कोई भी बग के किसी दस्तावेज़ को इंगित कर सकता है (यदि यह एक बग है) तो मैं इसकी सराहना करता हूं।

संपादित करें: @Anonymous कायर typedefs का उपयोग कर यदि OriginalClass निम्नलिखित करने के लिए बदल जाता है, यह संकलन होगा सुझाव:

class OriginalClass 
{ 
public: 
    class Delegate_t 
    { 
     virtual void original_func()=0; 
    }; 
    typedef Delegate_t Delegate; 
}; 
+0

कारण आप एक अलग कंपाइलर का उपयोग नहीं कर सकते हैं वास्तव में क्या है? त्रुटि स्वयं स्पष्ट है कि कंपाइलर के साथ कोई समस्या है, आपके पास कोई अन्य सबूत है, यह एक कंपाइलर बग है, और यह तथ्य नहीं कि संकलक इस क्षमता को याद कर रहा है? –

+0

@Ramhound 2005 के साथ चिपकने का कारण यह है कि मुझे पुराने विन्स डिवाइस का समर्थन करने की आवश्यकता है, जिसके लिए मेरे पास केवल 2005 एसडीके है। मुझे नहीं पता कि यह एक बग है, लेकिन मुझे अभी भी इस कोड को किसी भी तरह संकलित करने की आवश्यकता है। – Eoghan

उत्तर

2

एक नाम संकल्प समस्या वास्तव में हो रहा है यही कारण है कि। यह टाइपपीफ का उपयोग करते समय संकलित करता है:

class OriginalClass { 
    // class Delegate { ... }; 
    typedef Delegate delegate_t; 
}; 

class BaseClass : public OriginalClass::delegate_t { 
    // class Delegate { ... }; 
    typedef Delegate delegate_t; 
}; 

class DerivedClass : public BaseClass::delegate_t { 
    // ... 
}; 
+0

यह शानदार है, धन्यवाद। आपको केवल काम करने के लिए OriginalClass :: Delegate और typedef का नाम बदलने की आवश्यकता है। – Eoghan

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