2012-08-05 20 views
6

यही वह है जिसे मैं प्राप्त करना चाहता हूं। पत्ती घटक Component<ParentT> प्राप्त कर लेंगे, दूसरों Component<ParentT, ChildT>टेम्पलेट पैरामीटर redeclaration

template <typename T> 
class Component{ 
    protected: 
    typedef Component<T> ParentComponentT; 
    ... 
}; 

template <typename ParentT, typename ChildT> 
class Component: public Component<ParentT>{ 
    protected: 
    typedef std::vector<ChildT*> CollectionT; 
    ... 
}; 

प्राप्त कर लेंगे लेकिन समस्या यह खाका मापदंडों redeclared हो रही है। और मैं दूसरे को ऊपर से ऊपर नहीं ले जा सकता क्योंकि दूसरा व्यक्ति पहले व्यक्ति को विरासत में लेता है।

error: redeclared with 2 template parameter(s)
note: previous declaration ‘template class Component’ used 1 template parameter(s)

+1

पल के लिए विविध टेम्पलेट्स को अनदेखा करना, टेम्पलेट्स में निश्चित पैरामीटर हैं; एक एकल 'घटक <>' में एक और दो पैरामीटर नहीं हो सकते हैं। यह एक [एक्सवाई समस्या] की तरह दिखता है (http://meta.stackexchange.com/q/66377/166663) - आप वास्तव में क्या करने की कोशिश कर रहे हैं? – ildjarn

+0

फिर इसे मॉडल करने का अच्छा तरीका क्या है? 'घटक '? –

+0

यह निर्भर करता है - आप आधार और बच्चे के समान नाम क्यों चाहते हैं? उन्हें विभिन्न प्रकार के नाम दें और आपको कोई समस्या नहीं है। – ildjarn

उत्तर

3

यह संकलित और जहाँ तक मैं समझता हूँ कि तुम क्या पसंद करती है:

NoneT के लिए
#include <vector> 

class NoneT {}; 

template <typename ParentT,typename ChildT=NoneT> 
class Component: public Component<ParentT>{ 
    protected: 
    typedef std::vector<ChildT*> CollectionT; 
}; 

विशेषज्ञता:

template<> 
template<typename T> 
class Component<T,NoneT>{ 
protected: 
    typedef Component<T> ParentComponentT; 
}; 

int main(){ 
    typedef Component<double> someT; 
    typedef Component<double,int> someT2; 
    typedef Component<double,void> someT3; 
} 

someTParentComponentT होगा और someT2CollectionT होगा।

संपादित करें: टिप्पणी करने के लिए

उत्तर नीचे/प्रश्न: typename ChildT=noneT मतलब यह है कि डिफ़ॉल्ट ChildTnoneT हो जाएगा। इसलिए, यदि कोई दूसरा टेम्पलेट तर्क noneT प्रकार दिया गया है, तो इसका उपयोग किया जाएगा।

विशेषज्ञता तब एक-तर्क संस्करण के लिए कक्षा सामग्री को परिभाषित करती है।

EDIT2:

जब से मैं बातचीत, जिसे आप आधार वर्ग के रूप में घटक का उपयोग से पता है, मेरा सुझाव है कि जैसे

class myclass: public Component<Section, Line> 

कुछ करने के बजाय आप एकाधिक वंशानुक्रम इस्तेमाल कर सकते हैं

class myclass: public ParentComponent<Section>, CollectionComponent<Line> 

template <typename T> 
class ParentComponent{ 
    protected: 
    typedef Component<T> ParentComponentT; 
}; 

template <typename ChildT> 
class CollectionComponent { 
    protected: 
    typedef std::vector<ChildT*> CollectionT; 
}; 
+0

क्यों पहला टेम्प्लेट 'चाइल्डटी = नोट टी' या 'चाइल्डटी = शून्य' है? आप इसे –

+0

पर दूसरे में विशेषज्ञता दे रहे हैं। मैंने स्पष्ट किया कि अब –

+0

यदि कोई दूसरा टेम्पलेट तर्क दिया गया है तो यह टेम्पलेट के दूसरे संस्करण पर जाएगा। यह डिफ़ॉल्ट पैरामीटर की तलाश क्यों करेगा? –

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