मैंने नमूना कार्यक्रम के व्यवहार के साथ इंजेक्शन क्लास नाम contradicts (जैसा कि मैंने इसे देखा) के बारे में सी ++ मानक में पढ़ा है, मैं शीघ्र ही प्रस्तुत करूंगा। यहाँ मैं क्या पढ़ा है:संदिग्ध इंजेक्शन क्लास नाम त्रुटि नहीं है
3,4 से (पैरा 3)
एक वर्ग के इंजेक्शन-वर्ग-नाम (खंड 9) भी के लिए कि वर्ग के एक सदस्य माना जाता है नाम छिपाने और लुकअप के प्रयोजनों।
9 से (अनुच्छेद 2)
एक वर्ग-नाम गुंजाइश है जिसमें यह तुरंत बाद वर्ग नाम में देखा जाता है घोषित किया जाता है में डाला जाता है। कक्षा का नाम भी कक्षा के दायरे में डाला गया है; इसे इंजेक्शन-क्लास-नाम के रूप में जाना जाता है। एक्सेस चेकिंग के प्रयोजनों के लिए, इंजेक्शन-क्लास-नाम का मानना है कि यह एक सार्वजनिक सदस्य नाम था।
इन से मैं समझता हूँ कि निम्नलिखित एक अच्छी तरह से गठित अनुवाद इकाई है और इसे सफलतापूर्वक संकलित करता है।
#include <vector>
class X: std::vector<int>
{
vector mem;
};
हालांकि, मुझे लगता है कि होता है कि निम्नलिखित एक त्रुटि का उत्पादन किया जाना चाहिए था, लेकिन यह बाद से नाम vector
रूप std::vector<int>
और std::vector<char>
दोनों में इंजेक्ट किया जाता नहीं है
#include <vector>
class X: std::vector<int>, std::vector<char>
{
vector mem; //compiles OK... mem is apparently std::vector<int>
};
के रूप में एक सार्वजनिक सदस्य अगर नाम, तो इसे एक्स द्वारा विरासत में प्राप्त किया जाना चाहिए और इसलिए में vector
नाम अस्पष्ट होना चाहिए। क्या मैं कुछ भूल रहा हूँ?
पीएस मैं MSVC9.0
+1। अच्छा सवाल – Nawaz
क्या दूसरा खंड आपके उदाहरण में 'एक्स' का जिक्र नहीं कर रहा है? अर्थात। * इंजेक्शन-क्लास-नाम * 'वेक्टर' की बजाय 'एक्स' नहीं है? मुझे लगता है कि यह मामला है, और यदि ऐसा है तो उद्धरण कोड के लिए अप्रासंगिक हैं, लेकिन फिर भी उस कंपाइलर का व्यवहार सही नहीं लगता है या तो 'std :: vector' 'std :: को प्राथमिकता देने का कोई कारण नहीं है। वेक्टर 'और इसका मतलब है कि एक अस्पष्टता त्रुटि ट्रिगर होनी चाहिए। –
@ डेविड: कक्षा 'एक्स' हां में, लेकिन 'वेक्टर' को दोनों आधारों में सार्वजनिक नाम के रूप में इंजेक्शन दिया जाता है ... इसलिए इसे 'एक्स' के अंदर भी दिखाना चाहिए (और संदिग्ध) - जैसा कि पहले उदाहरण –