template <typename T> और template <class T> में क्या अंतर है। मेरे लिए दोनों एक ही परिणाम उत्पन्न कर रहे हैं।

उदाहरण के लिए

template <class T>
T Average(T *atArray, int nNumValues)
{
    T tSum = 0;
    for (int nCount=0; nCount < nNumValues; nCount++)
        tSum += atArray[nCount];

    tSum /= nNumValues;
    return tSum;
}

अगर मैं इसे template <typename T> में बदल दूं तो यह वही रहेगा

39
user658266 15 मार्च 2011, 05:59
2
 – 
DarenW
19 अगस्त 2011, 02:16

3 जवाब

सबसे बढ़िया उत्तर

इसमें कोई फर्क नही है। typename और class एक प्रकार के टेम्प्लेट पैरामीटर की घोषणा में विनिमेय हैं।

हालांकि, टेम्प्लेट टेम्प्लेट पैरामीटर घोषित करते समय आपको class (और typename नहीं) का उपयोग करना होगा:

template <template <typename> class    T> class C { }; // valid!
template <template <typename> typename T> class C { }; // invalid!  o noez!
65
James McNellis 15 मार्च 2011, 06:01
@ जेम्स: मुझे उस ने काट लिया है, क्या आप जानते हैं कि उस स्थिति में typename के अमान्य उपयोग के पीछे कोई तर्क है या नहीं? मैंने सोचा था कि typename का विचार class को नई कक्षाओं की घोषणा/परिभाषा के लिए आरक्षित करना था।
 – 
Matthieu M.
15 मार्च 2011, 10:04
@Matthieu: मुझे नहीं लगता कि कोई तर्कसंगत है, यह अभी हुआ। कोई व्यक्ति template<class T> के बजाय template<typename T> लिखना चाहता था, जब T एक वर्ग नहीं है। और उसे एक "क्यों नहीं!" मिला। प्रतिक्रिया! हर जगह, वर्ग और टाइपनाम अभी भी अलग हैं।
 – 
Bo Persson
15 मार्च 2011, 11:48
एम। यदि आप इसे करीब से देखते हैं, तो यह एक वर्ग घोषणा (ठीक है, एक वर्ग टेम्पलेट घोषणा) जैसा दिखता है। और उसी तरह जब एक वर्ग टेम्पलेट घोषित करते समय आपको वास्तविक प्रकार (!= तर्कों) के लिए class (या struct) का उपयोग करने की आवश्यकता होती है, तो आपको इसे यहां करने की आवश्यकता होती है। मुझे यह कम से कम सुसंगत लगता है।
 – 
David Rodríguez - dribeas
15 मार्च 2011, 11:50
@ डेविड: आह! मैं आपको तर्क देख सकता हूं, यह कुछ हद तक समझ में आता है।
 – 
Matthieu M.
15 मार्च 2011, 13:07
ध्यान दें कि C++17 से, अंतिम-मिनट के किसी भी परिवर्तन को छोड़कर, template<typename> typename मान्य हो जाएगा।
 – 
Justin Time - Reinstate Monica
8 जिंदा 2017, 03:05

वे अधिकांश समय के लिए समतुल्य और विनिमेय होते हैं, और कुछ टाइपनाम पसंद करते हैं क्योंकि उस संदर्भ में कीवर्ड वर्ग का उपयोग करना भ्रमित करने वाला लगता है।

उदाहरण के लिए template <class T> का उपयोग करते समय उन अस्पष्ट मामलों के लिए टाइपनाम की आवश्यकता क्यों है, उदाहरण के लिए, आप इस तरह एक टेम्पलेट परिभाषित करते हैं:

template <class T>
void MyMethod() {
   T::iterator * var;
}

और फिर किसी कारण से आपके टेम्पलेट का उपयोगकर्ता कक्षा को तुरंत चालू करने का निर्णय लेता है

class TestObject {
   static int iterator; //ambiguous
};

MyMethod<TestObject>(); //error

यह अस्पष्ट हो जाता है कि var क्या होना चाहिए, क्लास इटरेटर या स्थिर प्रकार int का उदाहरण। तो इस मामले के लिए टाइपनाम को टेम्पलेट ऑब्जेक्ट को एक प्रकार के रूप में व्याख्या करने के लिए मजबूर करने के लिए पेश किया गया था।

6
Chris Nolet 8 जिंदा 2017, 02:57

इसे देखो:

http://www.cplusplus.com/forum/general/8027/

वे दोनों एक ही व्यवहार उत्पन्न करते हैं। जब आप टाइपनाम का उपयोग करते हैं तो यह अधिक पठनीय होता है।

1
sajoshi 15 मार्च 2011, 06:02