जब आप संकलन चरण के दौरान टेम्पलेट का उपयोग करते हैं, तो कंपाइलर प्रत्येक टेम्पलेट तात्कालिकता के लिए कोड उत्पन्न करेगा। संकलन और लिंक करने की प्रक्रिया में .cpp फाइलें शुद्ध वस्तु या मशीन कोड में बदल जाती हैं, जिसमें उनमें संदर्भ या अपरिभाषित चिह्न होते हैं क्योंकि .h फाइलें जो आपके main.cpp में शामिल हैं, उनका कोई कार्यान्वयन नहीं होता है। ये एक अन्य ऑब्जेक्ट फ़ाइल से जुड़े होने के लिए तैयार हैं जो आपके टेम्पलेट के लिए एक कार्यान्वयन को परिभाषित करता है और इस प्रकार आपके पास पूर्ण a.out निष्पादन योग्य है।
हालाँकि, क्योंकि प्रत्येक टेम्पलेट तात्कालिकता के लिए कोड उत्पन्न करने के लिए संकलन चरण में प्रोसेस करने की आवश्यकता होती है, जिसे आप परिभाषित करते हैं, इसलिए केवल हेडर फ़ाइल से अलग एक टेम्पलेट को संकलित करना काम नहीं करेगा क्योंकि वे हमेशा बहुत कारण से हाथ और हाथ जाते हैं। प्रत्येक टेम्पलेट तात्कालिकता एक पूरी नई कक्षा है। एक नियमित वर्ग में आप .h और .cpp को अलग कर सकते हैं क्योंकि .h उस वर्ग का एक खाका होता है और .cpp कच्चा कार्यान्वयन होता है, इसलिए किसी भी कार्यान्वयन फ़ाइलों को नियमित रूप से संकलित और लिंक किया जा सकता है, हालाँकि यह .h का एक खाका है कि कैसे। क्लास को यह नहीं देखना चाहिए कि ऑब्जेक्ट को टेम्पलेट को कैसे देखना चाहिए। cpp फ़ाइल क्लास का कच्चा नियमित कार्यान्वयन नहीं है, यह क्लास के लिए केवल एक खाका है, इसलिए किसी भी .h टेम्पलेट फ़ाइल का कार्यान्वयन हो सकता है। '
इसलिए टेम्प्लेट को कभी भी अलग-अलग संकलित नहीं किया जाता है और केवल संकलित किया जाता है, जहां आपके पास किसी अन्य स्रोत फ़ाइल में एक ठोस तात्कालिकता है। हालाँकि, ठोस तात्कालिकता को टेम्प्लेट फ़ाइल के कार्यान्वयन को जानना आवश्यक है, क्योंकि केवल संशोधित करनाtypename T
.h फ़ाइल में एक ठोस प्रकार का उपयोग करने से काम नहीं चलने वाला है क्योंकि .cpp को लिंक करने के लिए क्या है, मैं इसे बाद में नहीं ढूंढ सकता क्योंकि याद रखना सार सार है और इसे संकलित नहीं किया जा सकता है, इसलिए मैं मजबूर हूं। कार्यान्वयन अभी देने के लिए इसलिए मुझे पता है कि संकलन और लिंक क्या करना है, और अब मेरे पास कार्यान्वयन है जो इसे एन्क्लेव गाइड फ़ाइल में लिंक हो जाता है। असल में, जिस क्षण मैं एक टेम्पलेट को त्वरित करता हूं, मुझे एक पूरी नई कक्षा बनाने की आवश्यकता होती है, और मैं ऐसा नहीं कर सकता कि अगर मुझे नहीं पता कि उस प्रकार का उपयोग करते समय मुझे उस कक्षा को कैसे देखना चाहिए, जब तक मैं संकलक को नोटिस नहीं करता हूं टेम्पलेट कार्यान्वयन, इसलिए अब कंपाइलर T
मेरे प्रकार के साथ बदल सकता है और एक ठोस वर्ग बना सकता है जो संकलित और लिंक किए जाने के लिए तैयार है।
योग करने के लिए, टेम्पलेट ब्लूप्रिंट हैं कि कक्षाओं को कैसे देखना चाहिए, किसी वस्तु को कैसे देखना चाहिए, इसके लिए कक्षाएं ब्लूप्रिंट हैं। मैं अपने ठोस तात्कालिकता से अलग टेम्पलेट्स संकलित नहीं कर सकता क्योंकि संकलक केवल ठोस प्रकारों को संकलित करता है, दूसरे शब्दों में, कम से कम C ++ में टेम्पलेट्स, शुद्ध भाषा अमूर्त है। हमें बोलने के लिए टेम्पलेट्स को डी-एब्सट्रेक्ट करना है, और हम ऐसा करने के लिए उन्हें एक ठोस प्रकार देते हैं ताकि हमारे टेम्पलेट अमूर्त एक नियमित क्लास फाइल में बदल सकें और बदले में, इसे सामान्य रूप से संकलित किया जा सके। टेम्पलेट .h फ़ाइल और टेम्पलेट .cpp फ़ाइल को अलग करना अर्थहीन है। यह निरर्थक है क्योंकि .cpp और .h का पृथक्करण केवल वही है जहाँ .cpp को अलग-अलग संकलित किया जा सकता है और व्यक्तिगत रूप से लिंक किया जा सकता है, क्योंकि हम उन्हें अलग से संकलित नहीं कर सकते हैं, क्योंकि टेम्पलेट एक अमूर्त हैं,
मतलब typename T
संकलन के चरण के दौरान लिंक करने का चरण नहीं है, इसलिए यदि मैं T
एक ठोस मूल्य प्रकार के रूप में प्रतिस्थापित किए बिना किसी टेम्पलेट को संकलित करने का प्रयास करता हूं, जो संकलक के लिए पूरी तरह से अर्थहीन है और परिणामस्वरूप ऑब्जेक्ट कोड नहीं बनाया जा सकता है क्योंकि यह नहीं करता है जानिए क्या T
है।
यह तकनीकी रूप से कुछ प्रकार की कार्यक्षमता बनाने के लिए संभव है जो टेम्पलेट को बचाएगा। सीपीपी फ़ाइल को टाइप करें और जब वे अन्य स्रोतों में मिलते हैं तो उन्हें स्विच आउट करें, मुझे लगता है कि मानक में एक कीवर्ड होता है export
जो आपको एक अलग तरीके से टेम्पलेट डालने की अनुमति देगा। cpp फ़ाइल लेकिन ऐसा नहीं है कि कई संकलक वास्तव में इसे लागू करते हैं।
बस एक साइड नोट, जब टेम्प्लेट क्लास के लिए विशेषज्ञता बनाते हैं, तो आप हेडर को कार्यान्वयन से अलग कर सकते हैं क्योंकि परिभाषा के अनुसार विशेषज्ञता का मतलब है कि मैं एक ठोस प्रकार के लिए विशेषज्ञता प्राप्त कर रहा हूं जिसे व्यक्तिगत रूप से संकलित और लिंक किया जा सकता है।