2010-05-01 19 views
5

का उपयोग करके "विरासत" प्रकार निम्न कोड संकलित नहीं करता है। मुझे एक त्रुटि संदेश मिलता है: त्रुटि C2039: 'Asub': 'सी'सीआरटीपी और टाइपपीफ

कोई सदस्य नहीं है क्या कोई इसे समझने में मेरी सहायता कर सकता है?

कोशिश की गई VS2008 & 2010 कंपाइलर।

template <class T> 
class B 
{ 
    typedef int Asub; 

public: 
void DoSomething(typename T::Asub it) 
{ 

} 
}; 

class C : public B<C> 
{ 
public: 
typedef int Asub; 

}; 

class A 
{ 
public: 
typedef int Asub; 

}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
C theThing; 
theThing.DoSomething(C::Asub()); 

return 0; 
} 
+1

आप चाहिए * हमेशा * p संकलन त्रुटियों के साथ रोवाइड लाइन संख्या। उदाहरण के लिए – abelenky

+0

'संरचना ए' क्या है? – AlwaysLearning

उत्तर

7

आप थोड़ा संकलक यहाँ करने के लिए अनुचित किया जा रहा है - C अधूरा है बिना B<C> पूरी तरह से जाना जाता है और जब B<C> प्रसंस्करण, C अभी भी एक अधूरा प्रकार है। comp.lang.c++.moderated और comp.lang.c++ पर समान धागे हैं।

ध्यान दें कि यह काम करता है आप एक सदस्य समारोह परिभाषा में ले जाकर उपयोग में देरी करते हैं, उदाहरण के लिए:

struct C : B<C> { 
    void f() { typedef typename C::Asub Asub; } 
}; 

आप या तो प्रकार स्पष्ट रूप से ऊपर की ओर पारित करके समस्या को हल करने सकता है:

template<class T, class Asub> struct B { /* ... */ }; 
class C : B<C, int> { /* ... */ }; 

... या उन्हें कुछ लक्षण दूसरी कक्षा में जाने यदि आप और अधिक उत्तीर्ण करने की आवश्यकता द्वारा:

template<class T, class Traits> struct B { 
    void DoSomething(typename Traits::Asub it) {} 
}; 

struct CTraits { 
    typedef int Asub; 
}; 

struct C : B<C, CTraits> { 
    typedef CTraits::Asub Asub;  
}; 
संबंधित मुद्दे