c++ - boost::intrusive_ptr constructor ambiguity using a class' 'this' pointer -
अपमानजनक कोड:
टेम्पलेट & lt; typename T & gt; वर्ग साझा ऑब्जेक्ट {सार्वजनिक: टाइप किया गया प्राथमिकता: intrusive_ptr & lt; T & gt; सूचक; Typedef बढ़ावा :: intrusive_ptr & lt; टी const & gt; ConstPointer; इनलाइन सूचक GetPointer () {वापसी पॉइंटर (यह); // अस्पष्ट कॉल यहाँ} इनलाइन कन्स्पेनॉटर गेट पाइंटर () कॉन्स्ट {रिटर्न कन्स्ट्रॉइन्टर (यह); } ...
और इस तरह प्रयोग किया जाता है:
टेम्पलेट & lt; typename T & gt; कक्षा कुछ क्लास: सार्वजनिक साझा ऑब्जेक्ट & lt; SomeClass & lt; T & gt; & Gt; {सार्वजनिक: स्थिर इनलाइन बढ़ावा :: घुसपैठ_प्रतिकृत & lt; SomeClass & lt; T & gt; & Gt; बनाएँ () {रिटर्न (नया कुछ क्लास) - & gt; GetPointer (); }}; Int main () {ऑटो वी = कुछ क्लास & lt; int & gt; :: बनाएँ (); }
जीसीसी (4.4.1) को बढ़ावा देने के साथ 1.41 GetPointer () के पहले (गैर स्थिरांक) संस्करण instatiating करते समय यह त्रुटि देता है:
त्रुटि : ओवरलोड किए गए 'घुसपैठ-एपीटीआर साझा ऑब्जेक्ट & lt; कुछ क्लास & lt; int & gt; & Gt; * स्थिरांक) 'अस्पष्ट बढ़ावा / smart_ptr / intrusive_ptr.hpp है: 118: ध्यान दें: उम्मीदवार हैं: को बढ़ावा देने :: intrusive_ptr & LT; टी & gt; :: intrusive_ptr (को बढ़ावा देने :: intrusive_ptr & LT; टी & gt; & amp; & amp;) [टी के साथ = कुछ क्लास & lt; int & gt;] & lt; निकट मैच & gt; को बढ़ावा देने के / smart_ptr / intrusive_ptr.hpp: 94: ध्यान दें: को बढ़ावा देने :: intrusive_ptr & LT; टी & gt; :: intrusive_ptr (स्थिरांक बढ़ावा :: intrusive_ptr & LT; टी & gt; & amp;) [टी = SomeClass & lt; पूर्णांक & gt;] & LT; पास मैच & gt; को बढ़ावा देने के / smart_ptr / intrusive_ptr.hpp: 70: ध्यान दें: को बढ़ावा देने :: intrusive_ptr & LT; टी & gt; :: intrusive_ptr (टी *, bool) [के साथ टी = SomeClass & LT; पूर्णांक & gt;] & LT; पास मैच & gt;
सी + + में मेरे रहस्यमय कौशल से कम, मैं नहीं देख सकता कि कोई भी अस्पष्टता क्यों नहीं है। 188 और 94 लाइनों पर दो canditates एक मौजूदा intrusive_ptr rvalue संदर्भ लेता है, जो SharedObject :: यह
निश्चित रूप से नहीं है। अंतिम उम्मीदवार हालांकि एक परिपूर्ण मैच है (bool तर्क वैकल्पिक है)।
कोई भी मुझे क्या समस्या है के रूप में प्रबुद्ध करने की परवाह है?
संपादित करें + उत्तर मजबूत>: मुझे अंत में यह महसूस हुआ कि
इनलाइन सूचक GetPointer () {वापसी पॉइंटर (यह); // संदिग्ध कॉल यहाँ}
यह
को साझा ऑब्जेक्ट को संदर्भित करता है, जबकि पॉइंटर टाइपएडफ़ कुछ क्लास है (जो बहुत सुंदर है जो बटरवर्थ सही दूर बताया गया है)।
इनलाइन सूचक GetPointer () {वापसी पॉइंटर (स्टेटिक_कास्ट & lt; C * & gt; (यह)); }
चूंकि मैं जानता हूं कि यह
वास्तव में SomeClass है, जो ShareObject से वंशानुक्रम है, एक static_cast टेम्प्लेट क्लास को गोल करता है।
जब आप कहते हैं:
typedef को बढ़ावा देने :: intrusive_ptr & LT; टी & gt; सूचक;
एक प्रकार है जो एक पूर्णांक
(क्योंकि टी
एक है पूर्णांक उस बिंदु पर), जब टेम्पलेट आपके कोड में तत्काल होता है। आपका साझा ऑब्जेक्ट क्लास एक
int
नहीं है, इसलिए आप यह
का उपयोग करके ऐसे घुसपैठ सूचक को इन्स्तांत नहीं कर सकते।
संपादित करें: ठीक है, मैं आपका कोड गलत समझा, मैं फिर से कोशिश करूंगा At:
<पूर्व> वापसी पॉइंटर (यह); // संदिग्ध कॉल यहां
यह एक साझा ऑब्जेक्ट है, त्रुटि संदेशों के अनुसार, हालांकि, कुछ क्लास के लिए पॉइंटर को टाइप किया गया है I think
आपका कोड समझना मुश्किल है - जो कुछ भी आप करने की कोशिश कर रहे हैं, वहां एक आसान तरीका होना चाहिए। और आप बेस क्लास में वर्चुअल डिस्ट्रक्टर (और शायद वर्चुअल फंक्शन) को याद नहीं कर रहे हैं।
Comments
Post a Comment