2014-05-15 13 views
6

मैं इस तरह के कोड भर में भाग गया है:टेम्पलेट निर्वासन (बनाम निर्वासन टेम्पलेट)

template<class T> extern void f(T a); 
ज फ़ाइल में

, और च() कई विशिष्ट टी cpp फ़ाइल में के साथ परिभाषित किया गया है।

मुझे इस वाक्यविन्यास के बारे में कोई स्पष्टीकरण नहीं मिला। मैंने देखा है कि बाहरी टेम्पलेट सी ++ 11 में पेश किया गया था लेकिन उनके पास अलग वाक्यविन्यास प्रतीत होता है ...

क्या कोई विस्तार कर सकता है?

धन्यवाद

+0

@ एड्रियनो - मैं दृढ़ता से असहमत हूं, मेरे प्रश्न –

+0

में अलग बाहरी वाक्यविन्यास नहीं है, यह सिर्फ एक बाहरी फ़ंक्शन टेम्पलेट की घोषणा है, यह कहकर कि आप इस टेम्पलेट को किसी अन्य फ़ाइल में परिभाषित करने जा रहे हैं (जैसे आप सामान्य के साथ करते हैं 'बाहरी' समारोह)। इस छोटे लेख के मुताबिक http://www.parashift.com/c++-faq/separate-template-fn-defn-from-decl.html, अधिकांश कंपाइलर इस तरह की चाल के साथ लिंकर त्रुटि फेंकता है। – Holt

+1

@ होल्ट यह केवल एक लिंकर त्रुटि में परिणाम देगा यदि आप एक अंतर्निहित तत्कालता बनाने का प्रयास करते हैं। ओपी का उल्लेख है कि टेम्पलेट '.cpp' फ़ाइल में कई स्पष्ट तत्काल (या शायद विशेषज्ञता) प्रदान करता है, इसलिए जब तक आप केवल उन्हें कॉल करते हैं, तो आप ठीक हैं। – Angew

उत्तर

7

extern यहाँ ज़रूरत से ज़्यादा है। इसका मतलब है कि इस टेम्पलेट से तत्काल कार्यों में बाहरी संबंध है। यह सामान्य extern है जो आप बाहरी लिंकिंग को इंगित करने के लिए एक साधारण फ़ंक्शन परिभाषा पर लागू होंगे। जो भी अनिवार्य है, क्योंकि कार्यों के डिफ़ॉल्ट रूप से बाह्य संबंध होते हैं। तो यह रूप में

template <class T> void f(T a); 

आप उल्लेख किया है कई स्पष्ट instantiations (या शायद विशेषज्ञताओं, आपके सवाल इस पर स्पष्ट नहीं है) कि एक ही .cpp फाइल में परिभाषित कर रहे हैं। इसका अभी भी extern कीवर्ड का उपयोग करने के लिए कुछ भी नहीं है, और इसके बिना भी किया जा सकता है।

+0

मैं विशेषज्ञता के लिए धन्यवाद कर रहा था, सुधार के लिए धन्यवाद। तो मूल रूप से आप कह रहे हैं कि बाहरी का कोई अर्थ नहीं है, और अगर मैं किसी अन्य संकलन इकाई (सीपीपी फ़ाइल) में f() का उपयोग करने का प्रयास करता हूं तो मुझे लिंकर त्रुटियां मिलनी चाहिए? –

+2

@ मार्क्स मैं कह रहा हूं कि 'बाहरी' का कोई अर्थ नहीं है और आपको लिंकर त्रुटियों को प्राप्त करना चाहिए यदि आप (अन्य अनुवाद इकाई में) एक विशेषज्ञता को '.cpp' फ़ाइल में स्पष्ट रूप से परिभाषित नहीं किया गया है जिसमें टेम्पलेट के definitinon तक पहुंच है। नियम हमेशा एक ही होते हैं: या तो अनुवाद इकाई को टेम्पलेट की परिभाषा तक पहुंच की आवश्यकता होती है, या एक स्पष्ट तत्काल/विशेषज्ञता को परिभाषित किया जाना चाहिए जहां लिंकर इसे प्राप्त कर सकता है। – Angew

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