c++ सी++ टाइप बेमेल नहीं समझना: कॉन्फ फू*फू*कॉन्स्ट &




pointers reference (4)

वस्तुओं और बयानों का यह सेट होने के नाते:

QSet<Foo*> set;
iterator QSet::insert(const T & value)    //type of the function I want to call
const Foo * get() const                   //type of the function I use to get the argument

set.insert(get());                        //the line showing up as error

मुझे त्रुटि मिलती है "कॉन्फ़ फ़ू * 'से' फू * कॉन्स्ट और 'से तर्क 1 के लिए कोई ज्ञात रूपांतरण नहीं है। मुझे लगता है मुझे इन प्रकारों को पढ़ने में परेशानी होती है क्योंकि मुझे नहीं पता कि यह काम करने के लिए मुझे क्या करना चाहिए।

मैंने जो पढ़ा है, से कस्ट कीवर्ड इसके शीर्ष पर एक शीर्ष-स्तरीय कन्स्ट्रक्शन के अपवाद के साथ प्रकार को लागू होता है जिसे उस प्रकार के बाईं तरफ लिखा जा सकता है जो इसे लागू होता है मेरा अनुमान है कि मुझे संदर्भ में कन्वर्ट करना होगा (लेकिन) मुझे यह अनिश्चित है कि यह कैसे करना है

https://code.i-harness.com


आप अपने get() फ़ंक्शन से पॉइन्टर की कॉन्सेस्ट का उल्लंघन कर रहे हैं। get() एक सूचक को एक प्रकार की वस्तु को Foo , लेकिन फिर आप इसे गैर-कॉन्स्ट Foo पॉइंटर्स के एक वेक्टर में सम्मिलित करने का प्रयास करते हैं। आपको get() से रिटर्न वेल्यू को const_cast करना होगा या const_cast const Foo* से रिटर्न प्रकार के get() को const Foo* बदलना होगा।


आप एक const Foo * लेने की कोशिश कर रहे हैं और उसे एक QSet<Foo *> में डालें, लेकिन कंपाइलर स्वचालित रूप से QSet<Foo *> const Foo * को एक सादे Foo * में परिवर्तित नहीं करेगा ताकि ऐसा करने के लिए किया जा सके


मैंने निम्न प्रकार के सेट को बदलकर इस समस्या का समाधान किया

QSet<Foo const*> set;

इस परिवर्तन के साथ, संकलन सफल होता है।


यहां कुछ गलतफहमी हो सकती है (प्रश्नकर्ता और कुछ उत्तर द्वारा)

सबसे पहले , आपने कहा, "मेरा अनुमान होगा कि मुझे संदर्भ में कन्वर्ट get() लेकिन मुझे यह अनिश्चित है कि यह कैसे करना है)"। चलो इसे साफ़ करने का प्रयास करें:

1) "मुझे एक संदर्भ में कन्वर्ट करना है" - असल में, आप नहीं!

iterator QSet::insert(const T & value) वास्तव में एक संदर्भ लेते हैं। लेकिन यह T टाइप करने का एक संदर्भ है तो सवाल यह है, "प्रकार क्या है T "?

इस मामले में, T=Foo * तो insert , टेम्पलेट के इस उदाहरण में, वास्तव में है:

iterator QSet::insert(Foo * const & value) - इसे दाएं से बाएं से पढ़ें: insert Foo एक स्थिर सूचक के लिए संदर्भ लेता है।

2) "मुझे यकीन है कि कैसे करना है [एक सूचक को एक संदर्भ में परिवर्तित करना]" - जब आपको इसे यहाँ नहीं करना पड़ता है, सामान्य तौर पर आप इसे पाने के परिणाम को डी-रेफ्रेंस करके करते हैं उदाहरण के लिए: *(get())

दूसरा , संकलक त्रुटि त्रुटि उत्पन्न होती है क्योंकि एक संघर्ष है:

ए) get() एक const Foo * रिटर्न get()

बी) लेकिन set एक Foo* - नहीं एक const Foo * , तो insert केवल एक अस्थिर Foo स्वीकार करता है

तो आप अपने QSet<Foo*> अंदर एक निरंतर सूचक संग्रहीत नहीं कर सकते यह समझ में आता है क्योंकि आप Foo अंदर प्रवेश करने और उसे बदलने के लिए set का उपयोग कर सकते हैं, जिसे आप const Foo साथ नहीं करने का वादा करते हैं।

यह संदर्भ सहायक होना चाहिए:

https://isocpp.org/wiki/faq/const-correctness

आप यह भी सोच सकते हैं कि क्या आप केवल एक QSet<Foo*> बजाय QSet<Foo> उपयोग कर सकते हैं पूर्व के मामले में, चीजें संभवतः आपके व्यवहार की अपेक्षा करती हैं।





const