2010-12-26 30 views
11

संभव डुप्लिकेट:
Use 'class' or 'typename' for template parameters?"टेम्पलेट <class T>" और "टेम्पलेट <typename T>" के बीच क्या अंतर है?

मैं दो अलग अलग टेम्पलेट वर्ग घोषणाओं देखें:

template <class T> class SampleClass1 
{ 
    // ... 
}; 

और

template <typename T> class SampleClass2 
{ 
    // ... 
}; 

इन दो कोडों के बीच क्या अंतर है?

संपादित करें: मैंने गलत टाइप "typedef" को "typename" में सही किया है।

+5

अंतर यह है कि पहला एक सही है, जबकि दूसरा गलत है। दूसरे में 'typedef' के बजाय' typename' का उपयोग करें, फिर कोई अंतर नहीं होगा! – Nawaz

+4

@ नवाज़: हाँ, गलत कीवर्ड के लिए खेद है। – hkBattousai

उत्तर

17

द्वारा

template <typedef T> class SampleClass2 

तुम्हारा मतलब तो

template <typename T> class SampleClass2 

फिर वहाँ कोई अंतर नहीं है। class और typename (किसी टेम्पलेट पैरामीटर के संदर्भ में जो किसी प्रकार से संदर्भित है) का उपयोग अदला-बदली है।

कारण दोनों कीवर्ड की अनुमति है ऐतिहासिक है। एक विस्तृत स्पष्टीकरण के लिए this article देखें।

14

टेम्पलेट टेम्पलेट के मामले में

परमाटर
template <typename T, template <typename> class Wrapper> 
class Foo { 
    //... 
    private: 
    Wrapper<T> data; 
}; 

आप classname से पहले वर्ग उपयोग करना होगा। यह गलत है:

template <typename T, template <typename> typename Wrapper> 

लेकिन यह ठीक है:

template <typename T, template <class> class Wrapper> 

अन्य मामलों में वे परस्पर विनिमय कर रहे।

+0

अद्यतन: सी ++ मानकीकरण समूह में एक नया प्रस्ताव है जो इस अंतर को खत्म करता है। N4051: टेम्पलेट टेम्पलेट पैरामीटर-रिचर्ड स्मिथ में टाइपनाम को अनुमति दें –

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