दिलचस्प पोस्ट
चर बनाम constexpr चर पर कार्य और धागे के बीच अंतर क्या है? एंड्रॉइड स्टूडियो: ग्रेड – बिल्ड विफल रहता है – कार्य निष्पादन के लिए विफल ': dexDebug' ITextSharp का उपयोग करने के लिए HTML में पीडीएफ कैसे परिवर्तित करें I आप यह कैसे बता सकते हैं कि लेआउट कब तैयार किया गया है? एक डेटाबेस से कनेक्शन स्ट्रिंग कैसे प्राप्त करें TypeError: 'str' ऑब्जेक्ट कोने योग्य नहीं है (पायथन) जावास्क्रिप्ट में नकल सेट? getResourceAsstream () बनाम फ़ाइलइनपुटस्ट्रीम एसिंक्रोनस पीएचपी कॉल? क्या कोई जावास्क्रिप्ट में "डेबंस" फ़ंक्शन को समझा सकता है? ServiceStack.Net Redis: संबंधित ऑब्जेक्ट बनाम संबंधित ऑब्जेक्ट आईडी दृश्य स्टूडियो 2010 के लिए OpenCV-2.3 सेटअप करें java.sql.SQLException: – ORA-01000: अधिकतम खुले कर्सर पार हो गए हैं ओरेकल एसक्यूएल में एक सिंगल उद्धरण को कैसे संभालना है

एक टेम्पलेट क्लास का कार्यान्वयन और घोषणा उसी हेडर फ़ाइल में क्यों होना चाहिए?

एक टेम्पलेट क्लास का कार्यान्वयन और घोषणा उसी हेडर फ़ाइल में क्यों होना चाहिए? क्या आप में से कोई भी उदाहरण के लिए इसे समझा सकता है?

वेब के समाधान से एकत्रित समाधान "एक टेम्पलेट क्लास का कार्यान्वयन और घोषणा उसी हेडर फ़ाइल में क्यों होना चाहिए?"

टेम्पलेट के प्रत्येक क्षणिकता के लिए कोड उत्पन्न करने के लिए संकलक को पूरी टेम्पलेट परिभाषा (केवल हस्ताक्षर नहीं) तक पहुंच की आवश्यकता है, इसलिए आपको फ़ंक्शन की परिभाषा को अपने शीर्ष लेख में ले जाना होगा।

अधिक जानकारी के लिए समावेश मॉडल के बारे में पढ़ें।

क्लास टेम्प्लेट की परिभाषा और इसके सदस्य कार्यों के क्रियान्वयन को प्रत्येक जगह पर दिखाई देना चाहिए जो इसे एक विशिष्ट प्रकार के साथ शुरू करते हैं। अर्थात् मेरे myTemplate<int> करने के लिए myTemplate<int> आपको अपने myTemplate<int> की पूर्ण परिभाषा और क्रियान्वयन देखने की myTemplate

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

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

यानी यदि आपके पास myTemplate<int> और myTemplate<std::string> को extern रूप में परिभाषित किया गया है, तो आप उन्हें ठीक से उपयोग कर सकते हैं, लेकिन यदि myTemplate<double> को myTemplate<double> परिभाषित नहीं किया गया है, तो आप कार्यान्वयन के बिना इसका उपयोग नहीं कर सकते।

उनके पास नहीं है

क्या आवश्यक है कि टेम्पलेट परिभाषा के लिए तत्काल (जहां यह प्रयोग किया जाता है) पर दिखाई दे, ताकि संकलक इस बिंदु पर टेम्पलेट से कक्षा / फ़ंक्शन प्राप्त कर सके।

हालांकि टेम्पलेट वर्गों के लिए दो हेडर फाइलों का उपयोग करने के लिए यह बेहद आम है:

 // foo_fwd.hpp template <typename T, typename U> struct Foo; // foo.hpp #include "foo_fwd.hpp" template <typename T, typename U> struct Foo { typedef std::pair<T,U> type; }; 

यह उन लोगों को अनुमति देता है, जिनके लिए कुछ हद तक हल्का शीर्ष लेख शामिल करने के लिए पूर्ण टेम्पलेट परिभाषा की आवश्यकता नहीं है, उदाहरण के लिए:

 //is_foo.hpp #include <boost/mpl/bool.hpp> #include "foo_fwd.hpp" template <typename Z> struct is_foo: boost::mpl::false_ {}; template <typename T, typename U> struct is_foo< Foo<T,U> >: boost::mpl::true_ {}; 

जो संकलन-समय थोड़ा तेज कर सकता है।

एक सामान्य वर्ग के मामले में, घोषणा संकलन के लिए पर्याप्त है, और इसी परिभाषाओं को जोड़ा जाएगा।

टेम्पलेट्स के मामले में, कंपाइलर को कोड बनाने के लिए भी परिभाषा की आवश्यकता होती है।

अंतर सी ++ सामान्य प्रश्न में समझाया गया है