2010-11-23 12 views
5

निम्नलिखित कार्यक्रम पर विचार करें। लिनक्स के तहत मुझे मिलता है:टेम्पलेट निरंतर प्रकार रूपांतरण लिनक्स (जीसीसी) के तहत काम नहीं कर रहा ऑपरेटर

test.cc: In function ‘int main()’: 
test.cc:17: error: passing ‘const Pack<8>’ as ‘this’ argument of ‘Pack<s>::operator X&() [with X = double, int s = 8]’ discards qualifiers 

क्यों? यह कॉन्स प्रकार रूपांतरण ऑपरेटर क्यों नहीं ले रहा है? मैं इसे कैसे ठीक कर सकता हूं और अभी भी सुविधाजनक टेम्पलेट प्रकार रूपांतरण ऑपरेटर (कॉन्स और कॉन्स्ट संस्करण नहीं) में है। धन्यवाद!

+0

मुझे GCC (और Comau) के साथ एक अलग त्रुटि मिल रही है। यह कोई रूपांतरण समारोह नहीं मिला है। शायद क्योंकि यह 'ऑपरेटर डबल()' जैसे रूपांतरण फ़ंक्शन की तलाश में है और उपयुक्त नहीं है (क्योंकि प्रदत्त वाले के पास भी संदर्भ है)। - यदि यह पहली जगह में एक अच्छा विचार है, तो नामित सदस्य फ़ंक्शन का उपयोग क्यों न करें? – UncleBens

+0

@UncleBens, आप सही हैं, नीचे देखें। –

+0

मैं ऑपरेटर डबल() का उपयोग नहीं करना चाहता, क्योंकि पैक क्लास किसी भी प्रकार से परिवर्तनीय होना चाहिए। मैंने जो उदाहरण पोस्ट किया है वह समस्या को प्रदर्शित करने के लिए नीचे छीन लिया गया है। – Nathan

उत्तर

5

सी ++ 03 मानक के अनुसार, यह कोड खराब गठित है क्योंकि टेम्पलेट तर्क कटौती X& या X const&const double के विरुद्ध घटा नहीं पाएगी।

सी ++ 03 यह बताने से चूक गया कि संदर्भ कटौती से पहले रूपांतरण फ़ंक्शन के रिटर्न प्रकार से अलग हो गया है, इसलिए आप अपने मामले में कभी भी मैच नहीं प्राप्त कर सकते हैं। सी ++ 0x, this will be fixed के लिए और नवीनतम वर्किंग पेपर में शामिल किया गया है, इसलिए यह कुछ कंप्यूटर्स के साथ संकलित हो सकता है जिसमें फिक्स को पीछे हटाना शामिल है।

आपका कोड वास्तव में एक अलग समस्या है: जीसीसी कि दोष रिपोर्ट संकल्प को लागू करता है, और वजह X के खिलाफ और X const के खिलाफ double तुलना (इसे बंद स्ट्रिप्स सीवी-क्वालिफायर कटौती करने से पहले!)। केवल X मैचों और इसलिए केवल पहला रूपांतरण फ़ंक्शन const Pack<8> तर्क के साथ कॉल में एकल उम्मीदवार है - यही कारण है कि जीसीसी रूपांतरण समारोह पर अनुपलब्ध const के बारे में शिकायत करता है। यदि आप निम्न कोड आज़माते हैं तो यह

// can't strip cv-qualifiers off "double const&" - there are no top-level 
// cv qualifiers present here! 
double const &d(p); 
+0

कॉन्स्ट क्वालीफायर क्यों 'डबल' से छीन लिया गया है? अगर मैं 'ऑपरेटर डबल कॉन्स्ट एंड() कॉन्स' जोड़ता हूं तो यह क्यों मेल खाता है? आप शायद सही हैं, लेकिन मुझे अभी तक समझ में नहीं आता है ... –

+0

@ सेवन क्योंकि 'कॉन्स्ट' का कोई मतलब नहीं है। वैसे भी रूपांतरण फ़ंक्शन की वापसी से मूल्य कॉपी किया गया है। 'कॉन्स्ट' का अर्थ केवल एक अर्थ है यदि इसे किसी सूचक या संदर्भ में दफनाया जाता है। यह तब होता है जब आप 'ऑपरेटर डबल कॉन्स्ट' करते हैं और इसलिए इसे टेम्पलेट तर्क कटौती की आवश्यकता नहीं होती है। यहां क्रूक्स केवल टेम्पलेट तर्क कटौती है: * वह * उम्मीदवारों के कार्यों को अधिभारित करता है जो संकल्प टेम्पलेट से निपटने पर विचार करता है। यदि आप 'ऑपरेटर डबल कॉन्स' लिखते हैं और फिर * आप उम्मीदवार फ़ंक्शन को स्पष्ट रूप से आपूर्ति करते हैं, और यहां यह एक उम्मीदवार फ़ंक्शन है जिसे कॉल किया जा सकता है। –

+0

एक सरल उदाहरण के साथ प्रयास करें: 'टेम्पलेट शून्य एफ (टी *);' यदि आप इसे 'एफ (0)' के साथ कहते हैं, तो यह काम नहीं करेगा क्योंकि 'int * के विरुद्ध' टी * 'की टेम्पलेट तर्क कटौती विफल हो जाती है। लेकिन अगर आप 'शून्य एफ (char *) घोषित करते हैं, और फिर' f (0) 'को कॉल करना यह पूरी तरह से ठीक काम करता है। –

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