2011-08-11 14 views
19

मैंने नमूना कार्यक्रम के व्यवहार के साथ इंजेक्शन क्लास नाम 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

+1। अच्छा सवाल – Nawaz

+0

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

+1

@ डेविड: कक्षा 'एक्स' हां में, लेकिन 'वेक्टर' को दोनों आधारों में सार्वजनिक नाम के रूप में इंजेक्शन दिया जाता है ... इसलिए इसे 'एक्स' के अंदर भी दिखाना चाहिए (और संदिग्ध) - जैसा कि पहले उदाहरण –

उत्तर

15

मुझे मिल गया! यह मानक में ठीक है! मैं सही था! यह अस्पष्ट होना चाहिए!

खण्ड 14.6.1 पैरा

पता चलता है कि एक इंजेक्शन-वर्ग-नाम (10.2) कुछ मामलों में एक अस्पष्टता में परिणाम कर सकते (ए देखने उदाहरण के लिए, यह एक से अधिक में पाया जाता है, तो बेस क्लास)। यदि 0 इंजेक्शन-क्लास-नाम पाए गए सभी समान क्लास टेम्पलेट के विशेषज्ञताओं का संदर्भ लें, और यदि नाम टेम्पलेट-तर्क-सूची के बाद है, तो संदर्भ क्लास टेम्पलेट को संदर्भित करता है, न कि विशेषज्ञता इसके, और संदिग्ध नहीं है।[उदाहरण:

template <class T> struct Base { }; 
template <class T> struct Derived: Base<int>, Base<char> 
{ 
    typename Derived::Base b; // error: ambiguous typename 
    Derived::Base<double> d; // OK 
}; 

अंत उदाहरण]

निष्कर्ष: किसी यह अभी तक एक और माइक्रोसॉफ्ट संकलक बग है। भाषा एक्सटेंशन को अक्षम करने से या तो मदद नहीं मिलती है।

4

नहीं, आप कुछ भी याद नहीं कर रहे हैं, और आपका कंपाइलर छोटी गाड़ी का व्यवहार करता प्रतीत होता है। आप देख सकते हैं कि जीसीसी इसे यहाँ संभालता है: http://ideone.com/MI9gz

इसकी त्रुटि संदेश है:

prog.cpp:4:4: error: reference to 'vector' is ambiguous 
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error: candidates are: class std::vector<char> std::vector<char>::vector 
/usr/lib/gcc/i686-pc-linux-gnu/4.5.1/../../../../include/c++/4.5.1/bits/stl_vector.h:171:5: error:     class std::vector<int> std::vector<int>::vector 
+0

आह, हाँ, वास्तव में! मुझे बस मानक से उद्धरण मिला (मेरा जवाब देखें) –

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