2015-05-05 12 views
8

को स्थिरांक फू * वस्तुओं और बयानों के इस सेट करने के बाद:सी ++ प्रकार मेल नहीं खाता समझने नहीं: फू * स्थिरांक और

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 के लिए रूपांतरण में जाना जाता प्राप्त फू * कॉन्स & "। मुझे लगता है मुझे इन प्रकारों को पढ़ने में परेशानी है क्योंकि मुझे नहीं पता कि मुझे यह काम करने के लिए क्या करना चाहिए।

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

+0

यह "शीर्ष-स्तर' const' "नहीं है। 'प्राप्त करें()' एक 'सूचकांक' सूचक नहीं, "कॉन्स्ट फू'" के लिए एक सूचक देता है। – Barry

+0

तो मेरी समझ है कि शुरुआत में एक 'const' सब कुछ पर लागू होता है, यह सही था? तब इस तरह के 'const' वास्तव में क्या लागू होता है? –

उत्तर

7

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

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

1) "मुझे get() को संदर्भ में परिवर्तित करना है" - दरअसल, आप नहीं करते!

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

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

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

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

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

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

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

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

इस संदर्भ उपयोगी होना चाहिए:

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

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

+1

https://isocpp.org/wiki/faq/const-correctness#const-ref-alt पर देख रहे हैं, क्या यह सच है कि 'कॉन्स्ट एक्स * 'मनमाने ढंग से जटिल प्रकार के लिए' एक्स कॉन्स्ट * 'के बराबर है' एक्स' ? –

+0

यह तब होता है जब 'एक्स' एक प्रकार है - ऐसा नहीं है कि 'एक्स' अधिक जटिल है .. असल में, यही कारण है कि मुझे' टी 'के लिए प्रतिस्थापित करने से पहले ठीक से स्वैप करना पड़ा। इसे 'एक्स कॉन्स्ट * लिखना' को दाएं से बाएं ("एक स्थिर 'एक्स' के लिए एक सूचक) को पढ़ने में आसान बनाता है। लेकिन इसे 'कॉन्स्ट एक्स *' लिखना स्रोत कोड में अधिक स्पष्ट बनाता है कि यह प्रकार" ए है निरंतर 'एक्स''। तो आमतौर पर आप इसे कोड में 'कॉन्स एक्स *' देखते हैं। – Corey

+0

टेम्पलेट्स के लिए यह भ्रमित हो सकता है, इसलिए ... जो भी 'क्यूसेट' लिखा था, उसे 'सम्मिलित करना चाहिए (कॉन्स टी और वैल्यू)' या ' सम्मिलित करें (टी कॉन्स और वैल्यू) 'और वे वही होंगे। लेकिन ऐसा इसलिए है क्योंकि संकलक जानता है कि क्या करना है। यदि ** ** आप पेपर पर या अपने सिर में' टी 'के लिए प्रतिस्थापित करना चाहते हैं, तो आप ** प्रतिस्थापन करने से पहले ** इसे 'डालने (टी कॉन्स्ट एंड वैल्यू)' के रूप में सोचना चाहिए। – Corey

5

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

+1

@ जेफफ्रे: क्योंकि 'क्यूसेट ' में गैर-कॉन्स्ट पॉइंटर्स शामिल हैं। आप पॉइंटर-टू-कॉन्स्ट को पॉइंटर-टू-नॉनकॉन्स्ट में स्पष्ट रूप से नहीं बदल सकते हैं। –

3

मैंने इस प्रकार के सेट को निम्नानुसार बदलकर समस्या हल की।

QSet<Foo const*> set; 

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

3

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

+0

ये दो अन्य विकल्प होंगे। –

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