एक टेम्पलेट वर्ग के कार्यान्वयन और घोषणा को एक ही शीर्षलेख फ़ाइल में क्यों होना चाहिए? क्या आप में से कोई इसे उदाहरण के द्वारा समझा सकता है?एक टेम्पलेट वर्ग के कार्यान्वयन और घोषणा को एक ही शीर्षलेख फ़ाइल में क्यों होना चाहिए?
उत्तर
टेम्पलेट के प्रत्येक तत्कालता के लिए कोड उत्पन्न करने के लिए कंपाइलर को संपूर्ण टेम्पलेट परिभाषा (केवल हस्ताक्षर नहीं) तक पहुंच की आवश्यकता है, इसलिए आपको कार्यों की परिभाषाओं को अपने शीर्षलेख में स्थानांतरित करने की आवश्यकता है।
अधिक जानकारी के लिए The Inclusion Model के बारे में पढ़ें।
नहीं, आप नहीं करते। आप प्रत्येक टीयू में मैन्युअल रूप से परिभाषा लिख सकते हैं, लेकिन निश्चित रूप से हेडर कन्वेंशन आपको ऐसे बकवास से बचने में मदद के लिए डिज़ाइन किया गया है। :) –
@LightnessRacesinOrbit क्या मैं पूछ सकता हूं कि टीयू क्या है? – athos
@athos http://en.wikipedia.org/wiki/Translation_unit_%28programming%29 –
कक्षा टेम्पलेट की परिभाषा और उसके सदस्य कार्यों के कार्यान्वयन को प्रत्येक स्थान पर दिखाई देना चाहिए जो इसे एक अलग प्रकार के साथ त्वरित करता है। यानी myTemplate<int>
को तुरंत चालू करने के लिए आपको myTemplate
की पूर्ण परिभाषा और कार्यान्वयन को देखने की आवश्यकता है।
ऐसा करने का सबसे आसान तरीका टेम्पलेट और उसके सदस्य कार्यों की परिभाषा को उसी शीर्षलेख में रखना है, लेकिन अन्य तरीके भी हैं। उदाहरण के लिए, आप सदस्य फ़ंक्शन कार्यान्वयन को एक अलग फ़ाइल में डाल सकते हैं जिसे अलग से शामिल किया गया था। इसके बाद आप इसे पहले हेडर से शामिल कर सकते हैं, या केवल उस कार्यान्वयन फ़ाइल को शामिल कर सकते हैं जहां आपको इसकी आवश्यकता है।
उदाहरण के लिए, एक अभ्यास स्पष्ट रूप से एक .cpp फ़ाइल में पैरामीटर के विशिष्ट सेट के लिए टेम्पलेट को तुरंत चालू करना है और हेडर में उन तत्काल extern
घोषित करना है। इस तरह, उन तत्कालताओं को टेम्पलेट सदस्य कार्यों के कार्यान्वयन की आवश्यकता के बिना अन्य स्रोत फ़ाइलों में उपयोग किया जा सकता है। हालांकि, जब तक कि आप कार्यान्वयन फ़ाइल शामिल नहीं करते हैं, आप टेम्पलेट पैरामीटर के अन्य सेटों का उपयोग करने में सक्षम नहीं होंगे।
यानी अगर आपने myTemplate<int>
और myTemplate<std::string>
के रूप में परिभाषित extern
तो आप उन्हें ठीक उपयोग कर सकते हैं, लेकिन अगर myTemplate<double>
extern
परिभाषित नहीं है तो आप उपयोग नहीं कर सकते कि कार्यान्वयन के बिना है।
सामान्य वर्ग के मामले में, घोषणा संकलन के लिए पर्याप्त है, और इसी परिभाषा से जुड़ी होगी।
टेम्पलेट्स के मामले में, कंपाइलर को भी परिभाषा की आवश्यकता है कोड उत्पन्न करें।
अंतर C++ FAQ में बेहतर समझाया गया है।
उन्हें नहीं करना है।
तत्कालता (जहां इसका उपयोग किया जाता है) पर टेम्पलेट परिभाषा को देखने के लिए आवश्यक है ताकि संकलक इस बिंदु पर टेम्पलेट से वर्ग/फ़ंक्शन प्राप्त कर सके।
हालांकि यह बहुत टेम्पलेट कक्षाओं के लिए दो हेडर फाइल उपयोग आम है:
// 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_ {};
जो संकलन-समय को थोड़ा बढ़ा सकता है।
- 1. अनुबंध वर्ग एक अमूर्त वर्ग होना चाहिए
- 2. शीर्षलेख फ़ाइल में परिवर्तनीय घोषणा
- 3. एक ही घोषणा के साथ एक वैश्विक विधि को एक ही घोषणा के साथ कॉल करना
- 4. यूनिट परीक्षणों को एक ही पैकेज में पता होना चाहिए?
- 5. बाहरी घोषणा और फ़ंक्शन परिभाषा दोनों एक ही फ़ाइल में
- 6. एक हेडर और आगे एक ही सीपीपी फ़ाइल में निहित कक्षा घोषित क्यों करें?
- 7. टाइप पैरामीटर घोषणा एक पहचानकर्ता नहीं होना चाहिए
- 8. एक टेम्पलेट वर्ग
- 9. एपीआई और कार्यान्वयन के बीच अलगाव कुल होना चाहिए?
- 10. लिंक एक ही वेब दृश्य में खुला होना चाहिए एंड्रॉयड
- 11. PHP ओओपी "कार्यान्वयन संगत होना चाहिए"
- 12. टेम्पलेट पैरामीटर प्रकार होना चाहिए?
- 13. सी ++: एक टेम्पलेट वर्ग
- 14. डब्ल्यूपीएफ लपेटें - सभी वस्तुओं में एक ही चौड़ाई होना चाहिए
- 15. क्या एक अमूर्त वर्ग 'विनाशक शुद्ध आभासी होना चाहिए?
- 16. JSpinner.DateEditor को वर्ष शामिल होना चाहिए, भले ही शुरुआत और अंत एक ही वर्ष हो,
- 17. इंटरफेस को उनके कार्यान्वयन से अलग परियोजना में होना चाहिए?
- 18. टेम्पलेट वर्ग में टेम्पलेट कन्स्ट्रक्टर को कक्षा परिभाषा में परिभाषित किया जाना चाहिए?
- 19. एक विधि स्थिर होना चाहिए?
- 20. जावा प्रतिबिंब: एक कार्यान्वयन वर्ग
- 21. हैडोप में क्या मैपर और रेड्यूसर स्थिर वर्ग होना चाहिए?
- 22. WCF वर्ग में एक ही नाम
- 23. Initialzing और एक variadic वर्ग टेम्पलेट
- 24. कक्षा के निर्माता में उप-वर्ग आरंभ करने के लिए कक्षा के उप-वर्ग वर्ग को स्थिर क्यों होना चाहिए?
- 25. क्यों नहीं मैं मल्टी-घोषणा कर सकते हैं एक वर्ग
- 26. सी # में मेरा सामान्य होना चाहिए। लॉगिंग लॉगर एक उदाहरण सदस्य या स्थैतिक होना चाहिए?
- 27. एक शीर्षलेख फ़ाइल में स्टेटिक चर
- 28. क्या एक टेम्पलेट वर्ग का एक आंतरिक वर्ग गैर-टेम्पलेट वर्ग हो सकता है?
- 29. सी ++ वर्ग टेम्पलेट एक टेम्पलेट है: टेम्पलेट तर्क अमान्य है
- 30. क्या मुझे शीर्षलेख या स्रोत फ़ाइल में निर्माता के साथ एक संरचना लागू करनी चाहिए?
उन्हें एक ही संकलन इकाई के भीतर दिखाई देना होगा।यदि वे दोनों – Anycorn
शामिल हैं तो वे अलग-अलग फाइलों में हो सकते हैं, वास्तव में यह दो फाइलों में घोषणा और कार्यान्वयन को विभाजित करने के लिए असामान्य नहीं है। हेडर में आमतौर पर कार्यान्वयन फ़ाइल शामिल होगी। – MSalters
@MSalters: टेम्पलेट कक्षाओं के साथ समस्याग्रस्त कौन सा है, यह सवाल यही है। काश मैं टिप्पणियों को कम कर सकता हूं। –