2013-05-08 7 views
7
struct B { 
    B() {} 
    B(int i) {} 
}; 

struct D : B { 
    using B::B; // <--- new C++11 feature 
}; 

D d1; // ok 
D d2(3); // ok 

"का उपयोग" अब, के साथ अग्रेषण व्युत्पन्न वर्ग के लिए अगर मैं इस तरह के रूप struct D के शरीर के अंदर एक नया निर्माता जोड़ने के लिए,:सी ++ 11 बेस निर्माता delegating/कीवर्ड

struct D : B { 
    using B::B; 
    D(const char* pc) {} // <--- added 
}; 

तो D d1; शुरू होता है संकलक त्रुटि दे रहा है (ideone अभी तक अपग्रेड नहीं किया गया है, मैं g ++ 4.8.0 का उपयोग कर रहा हूं)? हालांकि D d2(3); अभी भी काम करता है।

struct D के अंदर एक नया कन्स्ट्रक्टर जोड़ने के दौरान डिफ़ॉल्ट कन्स्ट्रक्टर को छूट क्यों दी जाती है?

+2

ऐसा लगता है कि मानक इस व्यवहार को निर्दिष्ट करता है: "उत्तराधिकारी कन्स्ट्रक्टर के उम्मीदवार सेट में प्रत्येक गैर-टेम्पलेट कन्स्ट्रक्टर के लिए ** कोई पैरामीटर नहीं है या एक पैरामीटर वाले प्रतिलिपि/प्रतिलिपि बनाने वाले कन्स्ट्रक्टर के अलावा **, एक कन्स्ट्रक्टर को पूरी तरह से घोषित किया जाता है [...] "[class.inhctor]/3 क्यों? पता नहीं .. – dyp

+1

ध्यान दें कि जिस डेमो से आप लिंक कर रहे हैं वह विरासत में रचनाकारों का समर्थन नहीं करता है। आप [यहां] (http://liveworkspace.org/) आज़मा सकते हैं, लेकिन फिलहाल ऐसा लगता है। –

+0

@DyP, कोड स्निपेट में आपने नया 'डी (कॉन्स char *) 'कन्स्ट्रक्टर – iammilind

उत्तर

4

वहाँ बनाम

struct D : B { 
using B::B; 
}; 

struct D : B { 
using B::B; 
D(const char* pc) {} // <--- added 
}; 

के बीच एक सूक्ष्म अंतर दूसरे मामले, संकलक को स्वत: जनरेट डिफ़ॉल्ट 'डी() {} "आप के लिए निर्माता में है। लेकिन यदि आप डी के लिए अपना स्वयं का कन्स्ट्रक्टर बनाते हैं, तो डिफ़ॉल्ट "डी() {}" अब उपलब्ध नहीं है। निश्चित रूप से आपने बी के डिफॉल्ट कन्स्ट्रक्टर को विरासत में मिला है, लेकिन यह संकलक को डिफ़ॉल्ट रूप से डी का निर्माण करने के बारे में नहीं बताता है।

+2

क्या आपके पास कोई संकेत है _why_ डिफ़ॉल्ट ctor विरासत में नहीं मिला है? – dyp

+0

डी का डिफ़ॉल्ट सीटीआर? – dchhetri

+0

हां, जैसा कि मैंने ओपी को अपनी टिप्पणी में कहा है, केवल गैर-डिफ़ॉल्ट गैर-प्रतिलिपि गैर-चालक सीटीर्स विरासत में हैं/प्राप्त किए जा सकते हैं। – dyp

0

प्रति GCC 4.8 changes, प्रतिद्वंद्वी उत्तराधिकारी का समर्थन करने के लिए संकलक 4.8.0 होना चाहिए।

D पर एक नया कन्स्ट्रक्टर जोड़ने के बाद लगता है, इसमें अब कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है। e.g. C++11

@DyP उल्लेख किया है (§12.9/3) ... संकलक परोक्ष डिफ़ॉल्ट निर्माता व्युत्पन्न वर्ग D के लिए (एक निर्माता कोई पैरामीटर वाले) की घोषणा नहीं खुराक।

विरासत में मिला एक निर्माता कोई पैरामीटर या एक कॉपी/कदम निर्माता एक एकल पैरामीटर होने के अलावा अन्य निर्माताओं की उम्मीदवार सेट में प्रत्येक गैर टेम्पलेट निर्माता के लिए, एक निर्माता परोक्ष एक ही निर्माता विशेषताओं के साथ घोषित है जब तक कक्षा में उसी हस्ताक्षर के साथ उपयोगकर्ता द्वारा घोषित कन्स्ट्रक्टर है जहां उपयोग-घोषणा प्रकट होती है।

+1

हालांकि, पोस्ट कोड जीसीसी 4.8 में संकलित नहीं है; डिफ़ॉल्ट कन्स्ट्रक्टर विरासत में नहीं मिला है, और एक और कन्स्ट्रक्टर जोड़ने से किसी को स्पष्ट रूप से परिभाषित किया जा सकता है। –

+0

क्या आपने दूसरी स्निपेट में कन्स्ट्रक्टर जोड़ने के बाद इसका परीक्षण किया था? –

+1

हां, यह ओपी पूछने में त्रुटि होगी। मेरा सुझाव है कि आप या तो यह समझाने के लिए जवाब बदल दें कि आपको त्रुटि क्यों मिलती है, या इसे हटा दें; बस त्रुटि को पुन: उत्पन्न करने से सवाल का जवाब नहीं मिलता है। –

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