हालांकि मानक सी ++ की कोई आवश्यकता नहीं है, कुछ कंपेलरों की आवश्यकता है कि सभी फ़ंक्शन टेम्पलेट्स को प्रत्येक अनुवाद इकाई में उपलब्ध कराया जाना चाहिए। असल में, उन कंपाइलरों के लिए, टेम्पलेट कार्यों के निकायों को उपलब्ध कराया जाना चाहिए एक हेडर फ़ाइल में। दोहराने के लिए: इसका मतलब है कि उन कंपाइलर्स उन्हें गैर-हेडर फ़ाइलों जैसे .cpp फ़ाइलों में परिभाषित करने की अनुमति नहीं देंगे।स्पष्ट करने के लिए, C++ ese इसका मतलब है कि यह:
// ORIGINAL version of xyz.h
template <typename T>
struct xyz
{
xyz();
~xyz();
};
नहीं ctor की इन परिभाषाओं और dtors के साथ संतुष्ट हो जाएगा: क्योंकि यह का उपयोग कर
// ORIGINAL version of xyz.cpp
#include "xyz.h"
template <typename T>
xyz<T>::xyz() {}
template <typename T>
xyz<T>::~xyz() {}
:
// main.cpp
#include "xyz.h"
int main()
{
xyz<int> xyzint;
return 0;
}
एक त्रुटि उत्पन्न करेगा। उदाहरण के लिए, Comeau सी के साथ ++ आप प्राप्त करेंगे:
C:\export>como xyz.cpp main.cpp
C++'ing xyz.cpp...
Comeau C/C++ 4.3.4.1 (May 29 2004 23:08:11) for MS_WINDOWS_x86
Copyright 1988-2004 Comeau Computing. All rights reserved.
MODE:non-strict warnings microsoft C++
C++'ing main.cpp...
Comeau C/C++ 4.3.4.1 (May 29 2004 23:08:11) for MS_WINDOWS_x86
Copyright 1988-2004 Comeau Computing. All rights reserved.
MODE:non-strict warnings microsoft C++
main.obj : error LNK2001: unresolved external symbol xyz<T1>::~xyz<int>() [with T1=int]
main.obj : error LNK2019: unresolved external symbol xyz<T1>::xyz<int>() [with T1=int] referenced in function _main
aout.exe : fatal error LNK1120: 2 unresolved externals
ctor या dtor xyz.cpp भीतर का कोई उपयोग नहीं है क्योंकि, इसलिए, वहाँ कोई instantiations वहाँ से होने की जरूरत है। बेहतर या बदतर के लिए, इस तरह टेम्पलेट काम करते हैं।
xyz<int>
के इस उदाहरण में xyz
के तत्काल अनुरोध का स्पष्ट रूप से अनुरोध करना है। एक जानवर बल के प्रयास में, यह यह के अंत में इस पंक्ति जोड़कर xyz.cpp में जोड़ा जा सकता:
template xyz<int>;
जो अनुरोध करता है कि (के सभी) instantiated जा xyz<int>
। हालांकि यह गलत जगह पर है, क्योंकि इसका मतलब यह है कि हर बार एक नया xyz प्रकार लाया जाता है कि कार्यान्वयन फ़ाइल xyz.cpp को संशोधित किया जाना चाहिए। एक कम दखल तरीका है कि फ़ाइल से बचने के लिए एक और बनाने के लिए है:
// xyztir.cpp
#include "xyz.cpp" // .cpp file!!!, not .h file!!
template xyz<int>;
यह अभी भी कुछ हद तक दर्दनाक है, क्योंकि यह अभी भी एक मैनुअल हस्तक्षेप हर एक नया xyz आगे लाया जाता है की आवश्यकता है। एक गैर-तुच्छ कार्यक्रम में यह एक अनुचित रखरखाव मांग हो सकती है।
बजाय, एक और तरीका यह दृष्टिकोण xyz.h के अंत में #include "xyz.cpp"
के लिए है:
// xyz.h
// ... previous content of xyz.h ...
#include "xyz.cpp"
आप निश्चित रूप से सचमुच करने के लिए ला सकता है (कट और पेस्ट करें) xyz.cpp की सामग्री xyz.h का अंत, इसलिए xyz.cpp से छुटकारा पा रहा है; यह फ़ाइल संगठन का एक प्रश्न है और अंत में प्रीप्रोकैसिंग के परिणाम समान होंगे, जिसमें सीटीओआर और डीटोर निकाय हेडर में होंगे, और इसलिए किसी भी संकलन अनुरोध में लाया गया है, क्योंकि यह संबंधित शीर्षलेख का उपयोग करेगा। किसी भी तरह से, इसका दुष्प्रभाव है कि अब हर टेम्पलेट आपकी हेडर फ़ाइल में है। यह संकलन धीमा कर सकता है, और इसके परिणामस्वरूप कोड ब्लोट हो सकता है। उत्तरार्द्ध तक पहुंचने का एक तरीका यह है कि प्रश्नों में प्रश्नों को घोषित करना है, इस मामले में सीटीओआर और डाटर, इनलाइन के रूप में, इसलिए आपको चल रहे उदाहरण में xyz.cpp को संशोधित करने की आवश्यकता होगी।
एक तरफ के रूप में, कुछ कंपाइलरों को यह भी आवश्यक है कि कुछ कार्यों को कक्षा के अंदर इनलाइन परिभाषित किया जाए, न कि एक के बाहर, इसलिए उपरोक्त सेटअप को उन कंपाइलरों के मामले में आगे tweaked करने की आवश्यकता होगी। ध्यान दें कि यह एक संकलक मुद्दा है, मानक सी ++ में से एक नहीं, इसलिए सभी कंपाइलरों को इसकी आवश्यकता नहीं है। उदाहरण के लिए, कॉमौ सी ++ नहीं करता है, न ही इसे चाहिए। हमारे वर्तमान सेटअप के विवरण के लिए http://www.comeaucomputing.com/4.0/docs/userman/ati.html देखें। संक्षेप में, कॉमौ सी ++ कई मॉडलों का समर्थन करता है, जिनमें से एक निर्यात कीवर्ड के इरादे (विस्तार के रूप में) के साथ-साथ निर्यात निर्यात का भी समर्थन करता है।
अंत में, ध्यान दें कि सी ++ निर्यात कीवर्ड मूल प्रश्न को कम करने के लिए है। हालांकि, वर्तमान में कॉमौ सी ++ एकमात्र कंपाइलर है जिसे निर्यात का समर्थन करने के लिए प्रचारित किया जा रहा है। कुछ विवरणों के लिए http://www.comeaucomputing.com/4.0/docs/userman/export.html और http://www.comeaucomputing.com/4.3.0/minor/win95+/43stuff.txt देखें। उम्मीद है कि अन्य कंपाइलर मानक सी ++ के अनुपालन तक पहुंचते हैं, यह स्थिति बदल जाएगी।उपरोक्त उदाहरण में, निर्यात का उपयोग कर मूल कोड है जो लिंकर त्रुटियों का उत्पादन करने के लिए लौट, और एक परिवर्तन करने का अर्थ है: xyz में
// xyz.h
export
// ... ORIGINAL contents of xyz.h ...
ctor और dtor: निर्यात कीवर्ड के साथ xyz.h में टेम्पलेट घोषणा करते हैं। सीपीपी को #ycludeing xyz.h के आधार पर निर्यात किया जाएगा, जो यह पहले से ही करता है। इसलिए, इस मामले में आपको xyztir.cpp की आवश्यकता नहीं है, न ही xyz.cpp के अंत में तत्काल अनुरोध, और आपको ctor या dtor मैन्युअल रूप से xyz.h में लाया जाने की आवश्यकता नहीं है। पहले दिखाए गए कमांड लाइन के साथ, यह संभव है कि संकलक स्वचालित रूप से आपके लिए यह सब करे।
नोट [ग्रेग रोजर्स का उत्तर] (http://stackoverflow.com/a/279617/481061) और वहां टिप्पणियां - 'निर्यात' कीवर्ड को मानक से हटा दिया गया था और शायद किसी अन्य कंपाइलर में कभी भी लागू नहीं किया जाएगा। –