2013-06-12 29 views
5

टेम्पलेट कटौती गलत लग रहा था, क्यों (सी) (बी) के बजाय कहा जाता है?टेम्पलेट कटौती गलत लगता है

#include <iostream> 
using namespace std; 
template<class T> void f(T){cout << "f(T)";}//(a) 
template<> void f<>(int*){cout << "f(int*)";}//(b) 
template<class T> void f(T*){cout << "f(T*)";}//(c) 
//void f(int*){cout <<"POD:f(int*)";}//(d) 

int main(int argc,char*argv[]) 
{ 
    int p = 1; 
    f(&p); 
    cout <<endl; 
    return 0; 
} 

उत्पादन:

f(T*)

+7

सी [क्यों समारोह टेम्पलेट्स विशेषज्ञ नहीं] (http://www.gotw.ca/publications/mill17.htm)। – juanchopanza

+1

@jogojapan मैंने प्रश्न को बेहतर ढंग से प्रतिबिंबित करने के लिए डुप्लिकेट का शीर्षक बदल दिया। – juanchopanza

उत्तर

3

ठीक है, के सेट सीधे क्या हम पहले डालते हैं।

(ए) एक फ़ंक्शन टेम्पलेट है। (बी) उस समारोह टेम्पलेट का एक विशेषज्ञ है। (सी) एक और फ़ंक्शन टेम्पलेट है जो अधिभार (ए) है।

जब आप f(&p) लिखते हैं तो विचार करने के लिए दो ओवरलोड हैं: दो फ़ंक्शन टेम्पलेट्स, (ए) और (सी)। में (सी) T*T से अधिक (ए) में अधिक विशिष्ट है, इसलिए (सी) उठाया जाता है।

अब टिप्पणी करें (डी) पर विचार करें। यह फ़ंक्शन टेम्पलेट (ए) का एक विशेषज्ञ नहीं है, लेकिन एक अतिरिक्त अधिभार है। f(&p) कॉल को हल करने के लिए, अब विचार करने के लिए तीन ओवरलोड हैं। (डी) एक टेम्पलेट नहीं है और int*&p के प्रकार से मेल खाता है, इसलिए यह दूसरे दो में उठाया जाता है।

+0

(बीएक्स) पहले ही कोड में है (डी) :) – yuan

+0

@ युआन ओह। मेरी आंखें सिर्फ टिप्पणी कोड के पीछे पढ़ा। डेमिट, वे बहुत अच्छी तरह से प्रशिक्षित हैं :( –

0

टेम्पलेट विशेषज्ञता टेम्पलेट के बाद आनी चाहिए। यहाँ, अपने मामले में, यह इस तरह दिखता है:

template<class T> void f(T){cout << "f(T)";}//(a) // Template 1 
template<> void f<>(int*){cout << "f(int*)";}//(b) // Specialization of template 1 
template<class T> void f(T*){cout << "f(T*)";}//(c) // Template 2, conceals template 1 

इसलिए, आप टेम्पलेट 2 instantiated मिलता है। सही तरह से टाइम्स ऑफ इंडिया यह है:

template<class T> void f(T*){cout << "f(T*)";} // Template 1 
template<class T> void f(T){cout << "f(T)";} // Template 2 
template<> void f<>(int*){cout << "f(int*)";} // Specialization of the template 1 

उत्पादन:

f(int*) 
संबंधित मुद्दे