8

संपादित करें: मिला duplicatetypedef विरासत

मैं वर्णन करने के लिए सबसे आसान काम करने के मामले में कुछ समस्या कोड काटे गए हैं निम्नलिखित: एक शुद्ध सार आधार वर्ग में मेरी typedef द्वारा विरासत में मिला नहीं किया जा रहा है व्युत्पन्न कक्षा कोड में नीचे मैं ConcreteTemplateMethod में system_t typedef वारिस करना चाहते हैं:

#include <iostream> 

// pure abstract template-method 
template <typename T> // T == Analyzer<U> 
class TemplateMethod { 
    public: 
    typedef T system_t; 

    virtual void fn (const system_t& t) const = 0; 
}; 


template <typename T> 
class Analyzer { 
    public: 
    void TemplatedAlgorithm (const TemplateMethod< Analyzer <T> >& a) const { 
     printf ("Analyzer::TemplatedAlgorithm\n"); 
     a.fn(*this); // run the template-method 
    } 

    void fn() const { 
     printf ("Analyzer::fn\n"); 
    } 
}; 


// concrete template-method 
template <typename T> 
class ConcreteTemplateMethod : public TemplateMethod < Analyzer<T> > { 
    public: 
    typedef Analyzer<T> system_t; 

    virtual void fn (const system_t& t) const { 
     printf ("ConcreteTemplateMethod::fn\n"); 
     t.fn(); // perform Analyzer's fn 
    } 
}; 

int main() { 

    Analyzer <double> a; 
    ConcreteTemplateMethod<double> dtm; 
    a.TemplatedAlgorithm(dtm); 

    return 0; 
} 

इस कोड को संकलित करता है तथा रन अपेक्षा के अनुरूप। ConcreteTemplateMethod में निम्नलिखित के लिए आवश्यक है, और जब हटाया कारणों संकलक त्रुटियों:

typedef Analyzer<T> system_t; 

ध्यान दें कि system_t प्रकार पहले से ही typedef 'आधार वर्ग में एड है तथापि,। विरासत में एक और टाइपपीफ क्यों शामिल होना चाहिए?

मुझे लगता है कि मैं typename TemplateMethod< Analyzer<T> >::system_t& का उपयोग करके ली गई ConcreteTemplateMethod में system_t की typename अर्हता प्राप्त कर सकते हैं, लेकिन यह एक बिट वर्बोज़ है, और मैं आधार हर मैं वारिस के typedef फिर से करने से बचने के लिए पसंद है और उपयोग करने की आवश्यकता होगी वही system_t। क्या इस के आसपास कोई रास्ता है कि मैं आधार TemplateMethod में परिभाषित कर सकता हूं?

+0

नहीं, आप सीधे ऐसा नहीं कर सकते हैं। हालांकि आप एक मैक्रो बना सकते हैं जो ऐसा करेगा। – Anycorn

+0

संभावित डुप्लिकेट [सी ++ में विरासत और टेम्पलेट्स - विधियों को अदृश्य क्यों हैं?] (Http://stackoverflow.com/questions/1567730/inheritance-and-templates-in-c-why-are-methods-invisible) –

उत्तर

8

आप

typedef typename TemplateMethod<X>::system_t system_t; 

typedef "वारिस" करने के लिए क्या करना चाहिए। typedef स्वचालित रूप से विरासत में नहीं है (यदि संकलक अनुपालन है)।

यदि आप स्टैक ओवरफ़्लो देखते हैं, तो कहीं भी इस प्रश्न का डुप्लिकेट होगा।