2010-04-28 15 views
7

मेरे पास क्लास माई क्लास है जो टाइपनाम टी पर टेम्पलेट किया गया है। लेकिन अंदर, मुझे एक विधि चाहिए जो किसी अन्य प्रकार के टीटी पर टेम्पलेट हो (जो कि इससे संबंधित नहीं है टी)।टीटी पर एक टेम्पलेटेड क्लास के अंदर टी पर टेम्पलेटेड विधि: क्या यह संभव/सही

पढ़ने/फेरबदल के बाद, मैं निम्नलिखित अंकन मिला:

template <typename T> 
class MyClass 
{ 
    public : 
     template<typename TT> 
     void MyMethod(const TT & param) ; 
} ; 

शैलीगत कारणों के लिए (मैं एक हेडर फाइल में मेरी टेम्प्लेटेड वर्ग घोषणा, और एक अन्य हेडर फाइल में विधि परिभाषाओं को लेना पसंद), मैं वर्ग घोषणा के अंदर विधि को परिभाषित नहीं करेगा।

template <typename T>  // this is the type of the class 
template <typename TT> // this is the type of the method 
void MyClass<T>::MyMethod(const TT & param) 
{ 
    // etc. 
} 

मुझे पता था कि मैं विधि में इस्तेमाल किया typenames "घोषित" था, लेकिन नहीं कैसे वास्तव में पता नहीं था, और परीक्षणों और त्रुटियों के माध्यम से पाया: तो, मैं के रूप में यह लिखने के लिए की है।

दृश्य सी ++ 2008 पर संकलित उपरोक्त कोड, लेकिन: क्या टी पर टेम्पलेट किए गए वर्ग के अंदर टीटी पर एक विधि को टेम्पलेट करने का यह सही तरीका है?

बोनस के रूप में: क्या इस तरह के कोड के पीछे छिपी हुई समस्याएं/आश्चर्य/बाधाएं हैं? (मुझे लगता है कि विशेषज्ञता लिखने के लिए काफी मनोरंजक हो सकती है)

+1

विशेषज्ञता के लिए: आप एक वर्ग समारोह को स्पष्ट रूप से विशेषज्ञता वाले वर्ग के बिना विशेषज्ञ नहीं कर सकते: http://stackoverflow.com/questions/2097811/c-syntax-for-explicit-specialization-of-a-template- समारोह में एक-टेम्पलेट स्तरीय/2114807 –

उत्तर

3

यह वास्तव में करने का सही तरीका है जो आप करना चाहते हैं, और यह हर सभ्य सी ++ कंपाइलर पर काम करेगा। मैंने इसे gcc4.4 और नवीनतम क्लैंग रिलीज पर परीक्षण किया।

किसी भी प्रकार के कोड के पीछे समस्या/आश्चर्य/बाधाएं हैं।

इस समस्या के साथ अंततः आप जो मुख्य मुद्दा चला सकते हैं वह यह है कि आप एक टेम्पलेटेड वर्चुअल वर्चुअल नहीं बना सकते हैं, इसलिए यदि आप अपने टेम्पलेटेड फ़ंक्शन के लिए क्लास लेवल पर पॉलिमॉर्फिज्म प्राप्त करना चाहते हैं, तो आप इसे कार्यान्वित कर रहे हैं एक बाहरी समारोह।

0

मुझे लगता है कि ऐसा करना ठीक है। Std :: वेक्टर कार्यान्वयन पर उदाहरण के लिए एक नज़र डालें। आपके पास कक्षा वेक्टर है, जिसमें कुछ टेम्पलेट पैरामीटर हैं (सबसे विशेष रूप से एक तत्व प्रकार), और अंदर, इसके रचनाकारों में से एक को आपकी विधि के समान ही घोषित किया गया है। इसमें इनपुट इटरेटर टेम्पलेट पैरामीटर के रूप में है। तो मुझे लगता है कि यह असामान्य अभ्यास नहीं है।

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