typename
और class
एक टेम्पलेट निर्दिष्ट करने के मूल मामले में विनिमेय हैं:
template<class T>
class Foo
{
};
तथा
template<typename T>
class Foo
{
};
समतुल्य हैं।
कहा जाता है कि, ऐसे विशिष्ट मामले हैं जहां typename
और के बीच अंतर है class
।
पहले एक निर्भर प्रकारों के मामले में है। typename
यह घोषित करने के लिए प्रयोग किया जाता है कि आप एक नेस्टेड प्रकार को संदर्भित कर रहे हैं जो किसी अन्य टेम्पलेट पैरामीटर पर निर्भर करता है, जैसे कि typedef
इस उदाहरण में:
template<typename param_t>
class Foo
{
typedef typename param_t::baz sub_t;
};
दूसरा वह जो आप वास्तव में अपने प्रश्न में दिखाते हैं, हालांकि आप इसे महसूस नहीं कर सकते हैं:
template < template < typename, typename > class Container, typename Type >
किसी टेम्पलेट टेम्पलेट को निर्दिष्ट करते समय , class
कीवर्ड को उपरोक्त के रूप में उपयोग किया जाना चाहिए - यह इस मामले में विनिमेय नहीं है (ध्यान दें: चूंकि C ++ 17 दोनों कीवर्ड इस मामले में अनुमत हैं) ।typename
class
किसी टेम्पलेट को स्पष्ट रूप से त्वरित करते समय आपको इसका उपयोग करना चाहिए :
template class Foo<int>;
मुझे यकीन है कि ऐसे अन्य मामले हैं जिन्हें मैंने याद किया है, लेकिन नीचे की रेखा है: ये दो कीवर्ड समतुल्य नहीं हैं, और ये कुछ सामान्य मामले हैं जहां आपको एक या दूसरे का उपयोग करने की आवश्यकता है।
template <typename T> typename Foo {};
, क्योंकि फू <टी> सबसे निश्चित रूप से एक वर्ग है।