त्रुटि: हटाए गए फ़ंक्शन का उपयोग


121

मैं कुछ C ++ कोड पर काम कर रहा हूं जो एक मित्र ने लिखा है और मुझे निम्नलिखित त्रुटि मिलती है जो मैंने gccf.6 के साथ संकलन करते समय पहले कभी नहीं देखी है:

error: use of deleted function

GameFSM_<std::array<C, 2ul> >::hdealt::hdealt()’ is implicitly deleted because the default definition would be ill-formed:
uninitialized non-static const member const h_t FlopPokerGameFSM_<std::array<C, 2ul> >::hdealt::h

संपादित करें: यह बूस्ट MSM: बूस्ट वेबपेज का उपयोग करके कोड के एक हिस्से से आता है

Edit2: सोर्सकोड = delete()में कहीं भी इसका उपयोग नहीं किया गया है।

सामान्यतया, इस त्रुटि का क्या अर्थ है? इस प्रकार की त्रुटि होने पर मुझे क्या देखना चाहिए?


4
और जो कोड आप संकलित कर रहे हैं?
Colwhi

मैं और अधिक सोच रहा था कि त्रुटि का क्या मतलब है? क्या मुझे उसके लिए भी कोड पोस्ट करने की आवश्यकता है?
शटल 87

1
gcc.gnu.org/bugzilla/show_bug.cgi?id=47417 मदद कर सकते हैं, क्या आप भी इसे बढ़ावा दे रहे हैं?
ColWhi

@ सस्क्विहा, हां मैं बूस्ट एमएसएम का उपयोग कर रहा हूं।
शटल 87

20
चूंकि यह इस प्रकार की त्रुटि के लिए पहला Google मिलान के रूप में सामने आता है - यहाँ मामला नहीं है, लेकिन इस तरह की त्रुटि का सबसे सामान्य कारण आपके द्वारा क्लास में कुछ कस्टम कंस्ट्रक्टर जोड़ने के बाद है - परिणामस्वरूप कंपाइलर डिफ़ॉल्ट कंस्ट्रक्टर बनाना बंद कर देता है , और यदि डिफ़ॉल्ट कंस्ट्रक्टर के माध्यम से कक्षा का एक उदाहरण कभी बनाया जाता है, तो यह त्रुटि दिखाई देती है। बस डिफ़ॉल्ट कंस्ट्रक्टर को विस्फोटक रूप से जोड़ें।
एसएफ।

जवाबों:


170

त्रुटि संदेश स्पष्ट रूप से कहता है कि डिफ़ॉल्ट निर्माता को अंतर्निहित रूप से हटा दिया गया है । यह यहां तक ​​कहता है कि क्यों: कक्षा में एक गैर-स्थैतिक, कास्ट वैरिएबल होता है, जिसे डिफ़ॉल्ट ctor द्वारा प्रारंभ नहीं किया जाएगा।

class X {
    const int x;
};

के बाद से X::xहै const, यह प्रारंभ किया जाना चाहिए - लेकिन कोई डिफ़ॉल्ट ctor सामान्य रूप से यह शुरू नहीं किया जा सकता है (क्योंकि यह एक पॉड प्रकार है)। इसलिए, डिफ़ॉल्ट ctor प्राप्त करने के लिए, आपको स्वयं को परिभाषित करने की आवश्यकता है (और इसे प्रारंभ करना होगा x)। आप एक सदस्य के साथ एक ही तरह की स्थिति प्राप्त कर सकते हैं जो एक संदर्भ है:

class X { 
    whatever &x;
};

यह शायद ध्यान देने योग्य है कि ये दोनों एक असाइनमेंट ऑपरेटर के निहित निर्माण को भी अक्षम कर देंगे, अनिवार्य रूप से उसी कारण से। अंतर्निहित असाइनमेंट ऑपरेटर सामान्य रूप से सदस्य-वार असाइनमेंट करता है, लेकिन एक कॉन्स्टेबल सदस्य या संदर्भ सदस्य के साथ, ऐसा नहीं कर सकता क्योंकि सदस्य को असाइन नहीं किया जा सकता है। असाइनमेंट का काम करने के लिए, आपको अपना असाइनमेंट ऑपरेटर लिखना होगा।

यही कारण है कि एक constसदस्य को आम तौर पर स्थिर होना चाहिए - जब आप एक असाइनमेंट करते हैं, तो आप वैसे भी कॉन्स्टेबल सदस्य को असाइन नहीं कर सकते। एक विशिष्ट मामले में आपके सभी उदाहरणों का मूल्य समान होने वाला है, इसलिए वे किसी एक चर की बहुत सारी प्रतियों के बजाय एक ही चर तक पहुंच साझा कर सकते हैं, जिसमें सभी का समान मूल्य होगा।

यह संभव है, बेशक, विभिन्न मूल्यों के साथ उदाहरण बनाने के लिए - आप (उदाहरण के लिए) जब आप ऑब्जेक्ट बनाते हैं तो एक मान पास करते हैं, इसलिए दो अलग-अलग वस्तुओं में दो अलग-अलग मूल्य हो सकते हैं। यदि, हालांकि, आप उन्हें स्वैप करने जैसा कुछ करने की कोशिश करते हैं, तो कास्ट सदस्य स्वैप किए जाने के बजाय अपने मूल मूल्य को बनाए रखेगा।


@ जेफ़्री कॉफ़िन: वास्तविक त्रुटि संदेश को संपादित के रूप में पोस्ट किया गया था, आरंभिक त्रुटि संदेश केवल पोस्ट किया गया थाC++ error: use of deleted function
आलोक सेव

1
@Als: क्षमा करें, मुझे शायद स्पष्ट होना चाहिए था कि मेरा इरादा उस आदेश पर अपमान या कुछ भी नहीं था, बस जो वर्तमान में उपलब्ध था, उसने स्पष्ट कर दिया कि वे उत्तर सही नहीं थे।
जेरी कॉफिन

कोई समस्या नहीं, मेरा मतलब यह नहीं था कि ... आपका जवाब शानदार है और स्थिति को सबसे अच्छा बताता है। +1 मुझ से :)
आलोक बचाओ

मुझे लगता है कि आप कृपया मेरी समस्या के लिए यहाँ मेरी मदद करने में सक्षम हो सकते हैं: stackoverflow.com/questions/23349524/…
साहेर अहवाल

2
@ ऑलीफ़ोर्ड: यह निर्भर करता है। क्या हो सकता है यदि (उदाहरण के लिए) आप उस क्षेत्र में एक मान के साथ एक वस्तु दूसरे को देते हैं जो उस क्षेत्र में एक अलग मूल्य रखता है? यदि इसे अधिलेखित किया जाना चाहिए, तो यह संकुचित नहीं हो सकता है। यदि इसे बिल्कुल भी अनुमति नहीं दी जानी चाहिए, तो मूल्य वास्तव में प्रकार का हिस्सा हो सकता है (जैसे, एक टेम्पलेट पैरामीटर, यदि संकलन समय पर जाना जाता है)।
जेरी कॉफिन

11

आप एक फ़ंक्शन का उपयोग कर रहे हैं, जो के रूप में चिह्नित है deleted
उदाहरण के लिए:

int doSomething( int ) = delete;

= हटाना C ++ 0x की एक नई विशेषता है। इसका मतलब है कि कंपाइलर को तुरंत कंपाइलिंग बंद कर देनी चाहिए और एक बार यूजर द्वारा इस तरह के फंक्शन का इस्तेमाल करने पर "यह फंक्शन डिलीट हो जाता है"।

यदि आप इस त्रुटि को देखते हैं, तो आपको इसके लिए फ़ंक्शन घोषणा की जांच करनी चाहिए =delete

C ++ 0x में पेश किए गए इस नए फीचर के बारे में अधिक जानने के लिए, इसे देखें


7
जिज्ञासा से बाहर, जब ऐसा कुछ करना सहायक होगा?
पेपे

@Peter: निहित रूपांतरणों को रोकने के लिए।
आर। मार्टिनो फर्नांडिस

7
वास्तव में यह कहता है कि "अंतर्निहित रूप से हटा दिया गया है क्योंकि ..." , उपरोक्त उदाहरण स्पष्ट होगा।
जॉर्ज फ्रिट्ज़

: @Peter आर: इस तरह दिखता है एक उदाहरण है en.wikipedia.org/wiki/...
shuttle87

1
@Downvoter: वास्तविक त्रुटि संदेश को संपादित के रूप में पोस्ट किया गया था, आरंभिक त्रुटि संदेश केवल पोस्ट किया गया थाC++ error: use of deleted function
आलोक सेव

4

gcc 4.6 हटाए गए कार्यों की एक नई सुविधा का समर्थन करता है, जहाँ आप लिख सकते हैं

hdealt() = delete;

डिफ़ॉल्ट कंस्ट्रक्टर को निष्क्रिय करने के लिए।

यहां संकलक ने स्पष्ट रूप से देखा है कि एक डिफ़ॉल्ट निर्माता उत्पन्न नहीं किया जा सकता है, और =deleteयह आपके लिए है।


2

अमूर्त वर्ग से विरासत में मिलने और अपने उपवर्ग में सभी शुद्ध आभासी तरीकों को लागू न करने पर मुझे इस त्रुटि का सामना करना पड़ा।


1
इसी तरह, मुझे public virtualदूसरे स्तर के बेस क्लास से व्युत्पन्न करके वही मिला जहां 1st-लेवल बेस क्लास में स्पष्ट रूप से हटाए गए डिफॉल्ट कंस्ट्रक्टर थे। हटाने virtualसभी तरीकों को लागू करने के बिना समस्या का समाधान हो।
मैत्रे बार्ट

1

वर्तमान C ++ 0x मानक में आप डिफॉल्ट कंस्ट्रक्टर को हटाए गए सिंटैक्स के साथ स्पष्ट रूप से अक्षम कर सकते हैं, जैसे

MyClass() = delete;

Gcc 4.6 इस सिंटैक्स का समर्थन करने वाला पहला संस्करण है, इसलिए शायद यही समस्या है ...


Gcc 4.6 is the first version to support this syntaxमुझे लगता है कि यह समझाऊंगा कि मैंने इसे पहले कभी क्यों नहीं देखा क्योंकि मैंने अभी हाल ही में gcc4.6 का उपयोग करना शुरू किया है।
शटल 87

2
मैं इस सिंटैक्स का उपयोग जीसीसी 4.5 के साथ वर्षों से कर रहा हूं। मेरा मतलब है दिन।
आर। मार्टिनो फर्नांडिस

आह, मैं प्रत्यायोजित साथियों के बारे में सोच रहा हूं जो जीसीसी 4.6 में हैं।
जर्मोंड

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.