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>
में बदल दूं तो यह वही रहेगा
3 जवाब
इसमें कोई फर्क नही है। typename
और class
एक प्रकार के टेम्प्लेट पैरामीटर की घोषणा में विनिमेय हैं।
हालांकि, टेम्प्लेट टेम्प्लेट पैरामीटर घोषित करते समय आपको class
(और typename
नहीं) का उपयोग करना होगा:
template <template <typename> class T> class C { }; // valid!
template <template <typename> typename T> class C { }; // invalid! o noez!
typename
के अमान्य उपयोग के पीछे कोई तर्क है या नहीं? मैंने सोचा था कि typename
का विचार class
को नई कक्षाओं की घोषणा/परिभाषा के लिए आरक्षित करना था।
template<class T>
के बजाय template<typename T>
लिखना चाहता था, जब T एक वर्ग नहीं है। और उसे एक "क्यों नहीं!" मिला। प्रतिक्रिया! हर जगह, वर्ग और टाइपनाम अभी भी अलग हैं।
class
(या struct
) का उपयोग करने की आवश्यकता होती है, तो आपको इसे यहां करने की आवश्यकता होती है। मुझे यह कम से कम सुसंगत लगता है।
template<typename> typename
मान्य हो जाएगा।
वे अधिकांश समय के लिए समतुल्य और विनिमेय होते हैं, और कुछ टाइपनाम पसंद करते हैं क्योंकि उस संदर्भ में कीवर्ड वर्ग का उपयोग करना भ्रमित करने वाला लगता है।
उदाहरण के लिए template <class T>
का उपयोग करते समय उन अस्पष्ट मामलों के लिए टाइपनाम की आवश्यकता क्यों है, उदाहरण के लिए, आप इस तरह एक टेम्पलेट परिभाषित करते हैं:
template <class T>
void MyMethod() {
T::iterator * var;
}
और फिर किसी कारण से आपके टेम्पलेट का उपयोगकर्ता कक्षा को तुरंत चालू करने का निर्णय लेता है
class TestObject {
static int iterator; //ambiguous
};
MyMethod<TestObject>(); //error
यह अस्पष्ट हो जाता है कि var क्या होना चाहिए, क्लास इटरेटर या स्थिर प्रकार int का उदाहरण। तो इस मामले के लिए टाइपनाम को टेम्पलेट ऑब्जेक्ट को एक प्रकार के रूप में व्याख्या करने के लिए मजबूर करने के लिए पेश किया गया था।
इसे देखो:
http://www.cplusplus.com/forum/general/8027/
वे दोनों एक ही व्यवहार उत्पन्न करते हैं। जब आप टाइपनाम का उपयोग करते हैं तो यह अधिक पठनीय होता है।
संबंधित सवाल
नए सवाल
c++
C ++ एक सामान्य-प्रयोजन प्रोग्रामिंग भाषा है। यह मूल रूप से C के विस्तार के रूप में डिज़ाइन किया गया था और इसमें एक समान सिंटैक्स है, लेकिन यह अब पूरी तरह से अलग भाषा है। C ++ कंपाइलर के साथ संकलित कोड के बारे में प्रश्नों के लिए इस टैग का उपयोग करें। विशिष्ट मानक संशोधन [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] या [C ++ 23], आदि से संबंधित प्रश्नों के लिए संस्करण-विशिष्ट टैग का उपयोग करें। ।