2009-01-14 8 views
11

सी ++ के बजाय विरासत एक टाइप किए गए टेम्पलेट को टाइप करने में असमर्थ है या एक टेम्पलेट श्रेणी टाइप किया गया है। मुझे पता है कि अगर मैं वारिस करता हूं और अपनी कक्षा को एक टेम्पलेट बना देता हूं, तो यह काम करेगा।टाइपपीफ

उदाहरण:

// Illegal 
template <class T> 
typedef MyVectorType vector<T>; 

//Valid, but advantageous? 
template <class T> 
class MyVectorType : public vector<T> { }; 

इस लाभप्रद कर रही है ताकि मैं "नकली" एक typedef या वहाँ बेहतर तरीके यह करने के लिए कर रहे हैं?

+0

समान प्रश्न, वही उत्तर: http://stackoverflow.com/questions/293988/generic-vector-of-vectors-in-c –

+0

आपका दूसरा उदाहरण भी अमान्य है। आपको MyVectorType के लिए अपने स्वयं के कन्स्ट्रक्टर लिखना होगा क्योंकि आप उनका वारिस नहीं कर सकते हैं। – Sebastian

उत्तर

13

C++ 0x using कीवर्ड का उपयोग टेम्पलेट typedefs जोड़ देगा।

आपका समाधान एक नया प्रकार घोषित करता है, न कि प्रकार "उपनाम", उदा। आप vector<T> के साथ MyVectorType & (संदर्भ) प्रारंभ नहीं कर सकते हैं। यह आपके लिए एक समस्या नहीं हो सकता है, लेकिन अगर यह है, लेकिन आप नहीं अपने कोड में वेक्टर संदर्भ लेना चाहते हैं, तो आप कर सकते हैं:

template <typename T> 
class MyVectorType { 
public: 
    typedef std::vector<T> type; 
}; 
+0

std :: वेक्टर में एक गैर-वर्चुअल विनाशक है, इसलिए आपको सावधान रहना होगा कि एक std :: vector * –

+0

के माध्यम से MyVectorType को मिटाना न भूलें, मैं MyVectorType को वास्तविक डेटाटाइप के रूप में उपयोग करने का प्रस्ताव नहीं दे रहा था, बल्कि MyVectorType :: प्रकार, जो std :: vector के लिए एक टाइपिफ़ है, इसलिए यहां कोई खतरा नहीं है। –

10

विरासत आप जो चाहते हैं वह नहीं है।

template <typename T> struct MyVectorType { 
    typedef std::vector<T> t; 
}; 

इस तरह typedef का संदर्भ लें: एक टेम्प्लेटेड typedef नकल करने के लिए एक और अधिक मुहावरेदार दृष्टिकोण यह है

MyVectorType<T>::t; 
1

सी ++ एक के बाहर एक टेम्पलेट करने में असमर्थ है typedef या typedef एक templated कक्षा।

है कि आप typedef से क्या मतलब है पर निर्भर करता है: std::vector<size_t> कानूनी है - भले ही size_t एक typedef है - और std::stringstd::basic_string<char> के लिए एक typedef है।