संपादित करें: मिला 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
में परिभाषित कर सकता हूं?
नहीं, आप सीधे ऐसा नहीं कर सकते हैं। हालांकि आप एक मैक्रो बना सकते हैं जो ऐसा करेगा। – Anycorn
संभावित डुप्लिकेट [सी ++ में विरासत और टेम्पलेट्स - विधियों को अदृश्य क्यों हैं?] (Http://stackoverflow.com/questions/1567730/inheritance-and-templates-in-c-why-are-methods-invisible) –