2010-02-03 24 views
9

मैं टेम्पलेट्स के निम्नलिखित सेट हैटेम्पलेट्स विशेषज्ञता

//1 
template< typename T > void funcT(T arg) 
{ 
    std::cout<<"1: template< typename T > void funcT(T arg)"; 
} 
//2 
template< typename T > void funcT(T * arg) 
{ 
    std::cout<<"2: template< typename T > void funcT(T * arg)"; 
} 
//3 
template<> void funcT<int>(int arg) 
{ 
    std::cout<<"3: template<> void funcT<int>(int arg)"; 
} 
//4 
template<> void funcT< int * >(int * arg) 
{ 
    std::cout<<"4: template<> void funcT< int *>(int * arg)"; 
} 

//... 

int x1 = 10; 
funcT(x1); 
funcT(&x1); 

किसी कृपया समझा क्यों funcT(x1); कॉल # 3 समारोह और funcT(&x1); कॉल समारोह # 2 लेकिन अपेक्षा के अनुरूप नहीं # 4?
मैंने पहले ही इस आलेख को http://www.gotw.ca/publications/mill17.htm पढ़ा है जो कहता है कि "ओवरलोड रिज़ॉल्यूशन विशेषज्ञता को अनदेखा करता है और केवल बेस फ़ंक्शन टेम्पलेट्स पर काम करता है"। लेकिन इस तर्क के अनुसार funcT(x1); फ़ंक्शन # 1 को कॉल करना चाहिए, न कि # 3। मैं उलझन में हूं।

+0

यह प्रासंगिक प्रतीत होता है: http://www.gotw.ca/publications/mill17.htm –

+0

मैं आपको इसके लिए वास्तव में एक पुस्तक भेज सकता हूं: एडिसन वेस्ले - सी ++ टेम्पलेट्स - पूर्ण मार्गदर्शिका – erick2red

उत्तर

11

कार्य # 3 और # 4 क्रमश: # 1 और # 2 की # 1 की विशेषज्ञता हैं।

इसका मतलब है कि आपका कंपाइलर पहले # 1 और # 2 के बीच चयन करेगा। जब उसने # 1 को funcT (x1) के लिए सबसे अच्छा फिट चुना है, तो यह विशेषज्ञता का चयन करता है, # 3। FuncT के लिए (& x1), यह # 2 को सर्वोत्तम फिट के रूप में चुनता है और कोई विशेषज्ञता नहीं पाता है।

रूप

template<> void funcT<>(int * arg) 

# 4 लिखकर यह # 2 की एक विशेषज्ञता हो जाता है और आप अपेक्षित परिणाम # 4 Funct (& x1) के लिए कहा जाता है कि मिल जाएगा।

एक अन्य विकल्प बस

void funcT(int *arg) 

लिखने के लिए हो सकता है नियमित कार्यों को हमेशा के बजाय चुना जाएगा के बाद से टेम्प्लेट की गई संस्करणों अगर वे मेल खाएगा।

+0

दाएं। आप इसे जोड़ सकते हैं, # 4 को # 2 का विशेषज्ञता और "अपेक्षित" व्यवहार प्राप्त करने के लिए, इसे 'टेम्पलेट <> शून्य funcT <> (int * arg)' –

+0

@ एरिक मालेनफैंट के रूप में लिखा जाना चाहिए: सही, मैं ' मुझे यकीन नहीं है कि आपकी टिप्पणी या मेरा संपादन पहले आया था, लेकिन वैसे भी धन्यवाद। – villintehaspam

+0

यह 'टेम्पलेट <> शून्य funcT <> (int * arg) क्यों है और' टेम्पलेट <> शून्य funcT (int * arg) 'क्यों नहीं है? – sepp2k

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