2012-10-03 26 views
10

मैंने कुछ नए कोड में कुछ const शुद्धता (वास्तव में कार्यात्मक प्रतिमान) शुरू करने की कोशिश की और पाया कि मैं की अपेक्षा रखने वाले फ़ंक्शन में पास नहीं कर सकता। ध्यान दें कि मैं स्थिरता को डालना नहीं चाहता हूं लेकिन इसे पेश करता हूं, जो कच्चे पॉइंटर्स के साथ कानूनी है।साझा_ptr <A> क्यों साझा नहीं किया गया है shared_ptr <A const> में?

क्या इसके आसपास जाने का कोई तरीका है? ऐसा करने के लिए मुझे सदस्य-फ़ंक्शन नहीं मिला।


सटीक जी ++ 4.6.1 ने बोला त्रुटि है:

error: no matching function for call to ‘foo(std::shared_ptr<A>)’ 
note: candidate is: 
note: template<class T> std::shared_ptr<_Tp> foo(std::shared_ptr<const _Tp>) 

उत्तर

9

अपने मामले में समस्या संभव रूपांतरण से/विभिन्न std::shared_ptr के साथ नहीं है, लेकिन कैसे प्रकार निष्कर्ष से अधिक संबंधित है टेम्पलेट कार्यों के लिए काम करता है।

जब संकलक टेम्पलेट के साथ फ़ंक्शन कॉल से मेल खाता है, तो यह केवल सटीक मैचों को स्वीकार करेगा, यानी कोई भी प्रकार का रूपांतरण नहीं है। इस मामले में, आपका फ़ंक्शन std::shared_ptr<const T> लेता है, और कॉलर के पास std::shared_ptr<U> है जहां Uconst नहीं है। चूंकि मैच सटीक नहीं है, यह टेम्पलेट को त्याग देगा और अगले अधिभार उम्मीदवार को चुनेंगे।

सरल कामकाज से जुड़े हैं: प्रकार निष्कर्ष पूरी तरह से बचने और टेम्पलेट तर्क प्रदान करते हैं:

std::shared_ptr<A> p; 
foo<A>(p);    // will use the templated shared_ptr conversion 

या प्रदर्शन रूपांतरण खुद:

foo(std::shared_ptr<const A>(p)); 
+0

'std :: static_pointer_cast (पी)' एक और है स्पष्ट रूप से रूपांतरण करने का तरीका। –

+0

@Luc: क्यों नहीं 'std :: const_pointer_cast (पी) '? – Xeo

+1

@Xeo क्योंकि हम सीवी-क्वालीफायर को नहीं हटा रहे हैं। –

संबंधित मुद्दे