2013-02-09 18 views
5

(मैं इस सवाल में Abrahams/Dimov example के ज्ञान संभालने कर रहा हूँ।)समारोह टेम्पलेट विशेषज्ञता और इब्राहीम/दिमोव उदाहरण

मान लें कि एक शीर्ष लेख है कि इस के लिए, आप बदल नहीं सकते हैं की तरह में कुछ 3 पार्टी कोड है:

template<class T> void f(T); // (1) base template 1 
template<class T> void f(T *); // (2) base template 2 
template<> void f<>(int *);  // (3) specialization of (2) 

सवाल यह है:

मैं ऊपर के रूप में है घोषणाओं दिया गया हो, यह संभव है मुझे अब इस मामले में जहांके लिए आधार टेम्पलेट 1 विशेषज्ञ के लिए(उदाहरण के लिए)?

या बेस टेम्पलेट 2 की केवल घोषणा ही दर्शाती है कि आधार टेम्पलेट 1 अब विशिष्ट नहीं हो सकता है (कम से कम पॉइंटर्स के लिए)?

+0

भले ही आप कर सकें, क्या वह विशेषज्ञता कॉल करने योग्य होगी? ऐसा लगता है कि बेस टेम्पलेट 2 हमेशा "जीत" करेगा यदि एफ को पॉइंटर के साथ बुलाया जाता है। – Mat

+0

@Mat: वर्तमान अनुवाद इकाई से, जहां तक ​​मैं देख सकता हूं, लेकिन यह किसी अन्य अनुवाद इकाई से कॉल करने योग्य हो सकता है, मुझे लगता है, है ना? अन्य अनुवाद इकाई को मानते हुए # 1 और इसी विशेषज्ञता के गैर-अधिभारित घोषणा है। – Mehrdad

+0

एक टीयू जिसमें आधार टेम्पलेट 2 गुंजाइश नहीं होगा? (यकीन नहीं है कि मैं समझता हूं।) ओडीआर उल्लंघनों से भी सावधान रहें। – Mat

उत्तर

0

आप हमेशा कोशिश कर सकते हैं और फिर हमारे पास आ सकते हैं। लेकिन मुझे नहीं लगता कि यह क्यों काम नहीं करेगा। यदि T = int* यह वही काम करेगा जैसा आप चाहते हैं। इसलिए कोई 2 int* *

+1

क्या मैंने उदाहरण को गड़बड़ कर दिया? मेरे लिए ऐसा लगता है कि 'टी = int *' के लिए विशेषज्ञता के समान सटीक सिंटैक्स की आवश्यकता होगी (3) ('टेम्पलेट <> शून्य एफ <> (int *); '), जो इसलिए असंभव बनाता है ... – Mehrdad

+0

@ Mehrdad आप काफी सही हैं। यह तब तक नहीं किया जा सकता है जब तक कि आपको किसी विशेष अधिभार को मजबूर करने का कोई तरीका न मिल जाए (कुछ अन्य अंतर बी/डब्ल्यू जो आप शोषण कर सकते हैं) –

+0

@ मेहरदाद मुझे यह मिला: आप '=' और निहित रूपांतरण 'ऑपरेटर के साथ कक्षा बना सकते हैं 'जो' int 'हैं लेकिन अपने फ़ंक्शन का अधिभार बनाते हैं जो कक्षा को स्वयं ले जाता है (इसलिए यह int के बजाय इसे चुना जाएगा) –

2

की एक पैरामीटर आप स्पष्ट रूप से समारोह के नाम के बाद कोण कोष्ठक में टेम्पलेट पैरामीटर को निर्दिष्ट (सीएफ सी ++ 11-स्टैंडर्ड 14.7.3)

द्वारा ओवरलोड कर सकते हैं (1) होगा
#include <iostream> 
using namespace std; 
template<class T> void f(T) // (1) base template 1 
{ 
    cout << "template<class T> void f(T)" << endl; 
} 

template<class T> void f(T *) // (2) base template 2 
{ 
    cout << "template<class T> void f(T *)" << endl; 
} 
//template<> void f<>(int *);  // (3) specialization of (2) 

template<> void f<int*>(int *)  // (4) specialization of (1) 
{ 
    cout << "f<int*>(int *)" << endl; 
} 


int main() { 
    int i; 
    f(&i); // calls (2) since only base-templates take part in overload resolution 
    return 0; 
} 
+0

सही, हालांकि यह "ओवरलोड" नहीं है। यह एक स्पष्ट विशेषज्ञता है। – Stephen305

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