2009-09-12 20 views
20

निम्नलिखित टेम्पलेट विशेषज्ञता कोड:सी ++ टेम्पलेट विशेषज्ञता: "स्पष्ट टेम्पलेट तर्क के अवैध उपयोग"

template<typename T1, typename T2> 
void spec1() 
{ 

} 

टेस्ट मामले 1:

template< typename T1> //compile error 
void spec1<int>() 
{ 

} 

टेस्ट मामले 2:

template< typename T2> //compile error 
void spec1<int>() 
{ 

} 

निम्न संकलन त्रुटि उत्पन्न करता है:

error C2768: 'spec1' : illegal use of explicit template arguments

क्या किसी को पता है क्यों?

+0

आप किस प्लेटफ़ॉर्म/कंपाइलर का उपयोग कर रहे हैं? – aaa90210

+0

मैं विजुअल सी ++ 08 – jameszhao00

उत्तर

51

समारोह टेम्पलेट्स आंशिक रूप से विशेष, केवल पूरी तरह से है, यानी ऐसा नहीं किया जा सकता:

template<> 
void spec1<char, int>() 
{ 

} 

क्यों समारोह टेम्पलेट्स आंशिक रूप से विशेष नहीं किया जा सकता है, तो आप read this कर सकते हैं के लिए।

जब आप आंशिक रूप से (केवल कक्षाओं के लिए संभव हो) के विशेषज्ञ हैं, तो आप इस तरह यह करने के लिए होगा:

template <typename T1> 
class class1<T1, int> 
{ 

}; 

ताकि आप फिर T1 सूची है।

आपकी विशेषज्ञता लिखे जाने के तरीके, वे spec1<int, int> के लिए संदिग्ध होंगे।

+3

आह का उपयोग कर रहा हूं इसलिए मैं आंशिक रूप से विशिष्ट वर्गों को स्थिर कार्यों के साथ एम्बेड कर सकता हूं? – jameszhao00

+0

ओह, मैं आपके द्वारा लिंक किए गए लेख को पहले से ही समझाता है। मैंने अपना जवाब हटा दिया, क्योंकि मैंने पाया कि इस मामले के लिए कक्षा में अग्रेषण अधिक सुविधाजनक है। ऐसे मामलों में जहां 'टी 1' और' टी 2' का उपयोग फ़ंक्शन पैरामीटर के प्रकार के रूप में किया जाता है, हालांकि, मुझे अधिक पठनीय अधिभार मिल रहा है, क्योंकि यह सामान्य कार्य ओवरलोडिंग की तरह ही है। –

+0

जब मैंने "कक्षाओं के लिए केवल संभव" पढ़ा, तो मैंने झुकाया। मैंने पाया कि यह कक्षाओं और structs दोनों के लिए संभव है ;-)। –

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