आपके पास यहां की समस्या यह है कि आपने .cpp फ़ाइल में कन्स्ट्रक्टर की परिभाषा को छुपाया है। यह परिभाषा पर सभी प्रकार T
, T
सहित int
के रूप में लागू होती है, लेकिन वास्तव में कोई परिभाषा नहीं देती है क्योंकि यह अभी भी केवल एक घोषणा है।
लिंकर Array<int>::Array()
प्रतीक नहीं ढूंढ सकता है। अपने Array.cpp फ़ाइल के अंत तक
Array<int> arr1;
और इस संकलक इन्स्तांत सही परिभाषा है कि लिंकर की तलाश में है बनाता है:
अब आप इस तरह की एक पंक्ति जोड़ सकते हैं। हालांकि, यह केवल एक परिभाषा की आपूर्ति करता है, Array<int>
और कोई अन्य नहीं।
यह समाधान काम करेंगे, जब तक आप एक अलग टेम्पलेट पैरामीटर के Array
double
की जरूरत है, कहते हैं,, जिस पर आप को जोड़ने के लिए की आवश्यकता होगी बिंदु:
Array<double> arr2;
अपने Array.cpp फ़ाइल के अंत में - अब आप देख सकते हैं कि यह कैसे असुरक्षित है!
आप सी ++ किसी भी प्रकार है कि आप भविष्य में चाहते हो सकता है के साथ काम करने की जरूरत है, अब समय हैडर में ctor की परिभाषा (और शायद अन्य सभी सदस्य कार्यों) स्थानांतरित करने के लिए (और हटाना है .cpp फ़ाइल के रूप में इसमें कुछ भी नहीं छोड़ा जाएगा)।
इस प्रश्न को https://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header-file पर लिंक करना उपयोगी है लेकिन यह वास्तव में एक डुप्लिकेट नहीं है। ओपी को ऐसा कुछ नहीं पता था जो पूरी तरह से उस प्रश्न में माना गया था। – Winter