मैं एक वर्ग है (यह पल के लिए base
कॉल) संरक्षित कंस्ट्रक्टर्स आदि base
वापसी मान द्वारा base
का एक उदाहरण से कुछ कार्यों सहित एक संरक्षित इंटरफेस, है:दृश्यता मुद्दा
class base {
protected:
base() {}
base (base const &other) {} // line 6
base foo() {
base ret;
return ret;
}
};
इन कार्यों व्युत्पन्न वर्ग में लिपटे रहे हैं ताकि तरह व्युत्पन्न प्रकार वापस जाने के लिए:
class derived : public base {
private:
derived(base const &b) : base(b) {}
public:
derived() : base() {}
derived foo() {
derived d(base::foo()); // line 21
return d;
}
};
एकमें base
वापसी प्रकार से रूपांतरण सुविधाजनक बनाने के लिएरिटर्न टाइप, मैं derived
में एक निजी कन्स्ट्रक्टर प्रदान करता हूं जो इसे संभालता है। ,, के अलावा
test.cpp: In member function ‘derived derived::foo()’:
test.cpp:6: error: ‘base::base(const base&)’ is protected
test.cpp:21: error: within this context
जीसीसी 4.6.1 और बजना 2.9 लिनक्स टकसाल 12 पर के साथ, कोड फ़ाइल संकलित भी -Wall -Wextra
साथ:
जीसीसी 4.1.2 के साथ Centos 5.8 पर इस संकलन निम्न त्रुटि पैदा करता है unused parameter
base
की कॉपी कन्स्ट्रक्टर के लिए चेतावनी।
मुझे लगता है कि यह जीसीसी 4.1.2 में एक कंपाइलर बग हो सकता है, लेकिन मैं नेट पर कुछ भी नहीं ढूंढ पाया। क्या किसी ने इसे पहले कभी देखा है?
मैं बड़े पैमाने पर बिना संक्रामक संकलक को अद्यतन नहीं कर सकता। क्या बेस क्लास सार्वजनिक की कॉपी कन्स्ट्रक्टर बनाने के अलावा कोई आसान कामकाज है?
संपादित मैं derived::foo()
में लाइन 21 से पहले base b;
गयी। उस स्थिति में, जीसीसी 4.6.1 और जीसीसी 4.1.2 शिकायत करते हैं कि base
का डिफ़ॉल्ट सीटीआर संरक्षित है, चेतावनी के बिना 2.9 संकलित है। डेविड रोड्रिगुएज़ - ड्रबीस ने अपनी टिप्पणी में कहा - डिफ़ॉल्ट सीटीआर base
के एक अलग उदाहरण पर नहीं कहा जा सकता है।
संपादित 2 मानक पैरा कि यहाँ लागू करने के लिए लगता है 11.5 [class.protected] है। जीसीसी 4.1.2 मेरे कोड को गलत के रूप में अस्वीकार करने में सही लगता है और मुझे आश्चर्य है कि जीसीसी 4.6.1 और क्लैंग इसे क्यों अनुमति देते हैं। प्रारंभिक समाधान के लिए अपना स्वयं का जवाब देखें।
चूंकि मार्कबी ने अपना जवाब हटा दिया है, इसलिए मैं मुख्य बिंदु यहां पोस्ट करूंगा: 'संरक्षित' आधार के किसी भी * उदाहरण पर उन सदस्यों को व्युत्पन्न प्रकारों तक पहुंच नहीं देता है प्रकार। आप केवल अपने व्युत्पन्न प्रकार के संरक्षित सदस्यों तक पहुंच सकते हैं। अर्थात।'व्युत्पन्न :: foo()' केवल 'इस' या किसी अन्य 'व्युत्पन्न' ऑब्जेक्ट से 'बेस' के संरक्षित सदस्यों तक पहुंच सकता है (जिसमें ऑब्जेक्ट्स का पूरा प्रकार स्वयं व्युत्पन्न 'से लिया गया है) –
हाँ, मैंने इसके बारे में पढ़ा भी (इसे मानक में भी देखा), और यह मेरा पहला विचार भी था, लेकिन मुझे आश्चर्य है कि क्यों दोनों जीसीसी 4.6.1 और clang 2.9। समस्याओं के बिना इसे संकलित करें। – arne
+1 @ डेविडरोड्रिगुएज़-ड्राईबीस आंख खोलने। मैं इस पूरे समय गलत इंप्रेशन के तहत रहा हूं। इतना ही नहीं, मैं सटीक विपरीत ** ** ** ** था। –