Friday, 15 April 2011

c++ - Why can templates only be implemented in the header file? -


से उद्धरण:

इस समय टेम्पलेट्स का उपयोग करने का एकमात्र पोर्टेबल तरीका है इनलाइन फ़ंक्शंस का उपयोग करके हेडर फाइल में।

यह क्यों है?

(स्पष्टीकरण: हेडर फाइल केवल पोर्टेबल समाधान नहीं है लेकिन वे सबसे सुविधाजनक पोर्टेबल समाधान हैं।)

यह नहीं आवश्यक है हेडर फाइल में कार्यान्वयन करने के लिए, इस उत्तर के अंत में वैकल्पिक हल देखें।

फिर भी, आपका कोड असफल रहने का कारण यह है कि जब एक टेम्पलेट को तत्काल बनाया जाता है, तो कंपाइलर एक नया वर्ग बनाता है दिए गए टेम्पलेट तर्क उदाहरण के लिए:

  टेम्पलेट & lt; typename T & gt; संरचना फू {टी बार; शून्य करना कुछ (टी परम) {/ * टी का उपयोग कर सामान करते हैं}}; // कहीं एक। सीपीपी में फू & lt; int & gt; च;  

इस लाइन को पढ़ते समय, संकलक एक नया वर्ग (चलो इसे FooInt कहते हैं) बनायेगा, जो निम्न के बराबर है:

  ढांचे FooInt {int बार; शून्य से कुछ (इंट परम) {/ * इंट का उपयोग करते हुए सामान करते हैं}}  

नतीजतन, संकलक को विधियों के कार्यान्वयन तक पहुंच की आवश्यकता होती है, उन्हें टेम्पलेट तर्क के साथ इन्स्तांत करने की आवश्यकता होती है (इस मामले में int )। यदि ये कार्यान्वयन शीर्षलेख में नहीं थे, तो वे सुलभ नहीं होंगे, और इसलिए संकलक टेम्पलेट को इन्स्तांत करने में सक्षम नहीं होगा।

इसका एक सामान्य समाधान है कि टेम्पलेट घोषणापत्र लिखकर शीर्ष लेख फ़ाइल, फिर कार्यान्वयन फ़ाइल में वर्ग को लागू करें (उदाहरण के लिए .tpp), और हेडर के अंत में इस क्रियान्वयन फ़ाइल को शामिल करें।

  // Foo.h टेम्प्लेट & lt; typename T & gt ; संरचना फू {शून्य से कुछ (परम); }; #include "Foo.tpp" // Foo.tpp टेम्पलेट & lt; typename T & gt; Void Foo & lt; T & gt; :: doSomething (T param) {// कार्यान्वयन}  

इस तरह, कार्यान्वयन अभी भी घोषणा से अलग है, लेकिन संकलक के लिए सुलभ है।

< P> एक अन्य समाधान को कार्यान्वयन अलग रखना है, और सभी टेम्पलेट उदाहरणों को स्पष्ट रूप से इन्स्तांत करना है जिन्हें आप की आवश्यकता होगी:

  // Foo.h // कोई कार्यान्वयन टेम्पलेट & lt; typename T & gt; Struct Foo {...}; // ---------------------------------------- // Foo.cpp // कार्यान्वयन फू के तरीकों के बारे में स्पष्ट स्पष्टता टेम्पलेट वर्ग Foo & lt; int & gt ;; टेम्पलेट वर्ग फू & lt; float & gt ;; // यदि आप केवल स्पष्टीकरण स्पष्ट नहीं कर रहे हैं, तो आप केवल वही फू या फ्लोट का उपयोग कर सकते हैं 


No comments:

Post a Comment