मुझे लगता है कि इस से पहले पूछा गया है, लेकिन मैं इसे SO पर नहीं ढूंढ पा रहा हूं, और न ही मुझे Google पर कुछ भी उपयोगी मिल सकता है। हो सकता है कि "covariant" वह शब्द नहीं है जिसे मैं ढूंढ रहा हूं, लेकिन यह अवधारणा कार्यों पर कॉन्वेंट रिटर्न प्रकारों के समान ही है, इसलिए मुझे लगता है कि यह शायद सही है। यहाँ मैं क्या करना चाहते हैं और यह मुझे एक संकलक त्रुटि देता है:सी ++ कॉन्वेंट टेम्पलेट
class Base;
class Derived : public Base;
SmartPtr<Derived> d = new Derived;
SmartPtr<Base> b = d; // compiler error
मान लें उन वर्गों पूरी तरह से बाहर fleshed कर रहे हैं ... मैं तुम्हें अंदाजा हो लगता है। यह किसी अस्पष्ट कारण के लिए को SmartPtr<Base>
में परिवर्तित नहीं कर सकता है। मुझे याद है कि यह सी ++ और कई अन्य भाषाओं में सामान्य है, हालांकि फिलहाल मुझे याद नहीं है कि क्यों।
मेरा मूल प्रश्न यह है: इस असाइनमेंट ऑपरेशन को करने का सबसे अच्छा तरीका क्या है? वर्तमान में, मैं पॉइंटर को SmartPtr
से बाहर खींच रहा हूं, इसे मूल प्रकार के लिए स्पष्ट रूप से ऊपर ला रहा है, फिर उचित प्रकार के नए SmartPtr
में लपेट रहा हूं (ध्यान दें कि यह संसाधनों को लीक नहीं कर रहा है क्योंकि हमारे घर से उगाए गए SmartPtr
कक्षा घुसपैठ संदर्भ का उपयोग करती है बढ़ रहा है)। यह लंबा और गन्दा है, खासकर जब मुझे SmartPtr
को किसी अन्य ऑब्जेक्ट में लपेटने की आवश्यकता है ... कोई शॉर्टकट?
टिप्पणियां छिपाएं @MSN: मैंने परीक्षण-और-त्रुटि से सीखा है कि यह "सामान्य" प्रतिलिपि निर्माता और असाइनमेंट ऑपरेटर को पूरा करने के लिए पर्याप्त नहीं है। इसलिए आपको दोनों को कार्यान्वित करना होगा: स्मार्टपीआरटी (कॉन्स स्मार्टप्रेट और) और टेम्पलेट <क्लास अन्य टाइप> स्मार्टपीआरटी (कॉन्स स्मार्टपीआर और) (op = के लिए समान) –
mmmmmmmm
ठीक है, यही मेरा मतलब है :) – MSN
सी ++ 11 से आगे आप चालक-कन्स्ट्रक्टर और चाल-असाइनमेंट भी जोड़ते हैं ('&&'' वाले)। –