कृपया नीचे दिए गए कोडका उपयोग कर-घोषणा का एक अजीब व्यवहार
struct A { using type = int; };
struct B : private A {};
struct C : B { using base_type = A; };
जीसीसी 6.1 के सभी बजना 3.8 देखते हैं, और MSVC 2015 अपडेट 3, इस संकलन से इंकार कर दिया के रूप में A
के बाद से C
अंदर एक सुलभ नाम नहीं है A
B
का एक निजी आधार है। ऐसा लगता है कि जीसीसी A
using base_type = A
में A
के डिफ़ॉल्ट कन्स्ट्रक्टर को संदर्भित करता है। एमएसवीसी और क्लैंग नहीं लग रहा है।
शायद संकलन त्रुटि विरासत से शुरू हो रहा नामों में से इंजेक्शन की वजह से है (क्योंकि संशोधित using base_type = ::A
में using base_type = A
सब compilers ठीक से काम कर रहे हैं), लेकिन मैं अगर यह अजीब त्रुटि क्या मानक का कहना है जानना चाहते हैं।
अधिक वस्तुतः,
- के रूप में मैं समझ गया,
A::type
पसंद नहीं,A
सिर्फ एक वर्ग के नाम है (हालांकि एक समारोह नाम के रूप में जीसीसी misinterprets यह) जोC
नहीं अंदरA
है और न हीB
के लिए शुरू की है। इस नाम कोB
पर निजी क्यों माना जाता है? - क्या इस संकलन त्रुटि को बग माना जाना चाहिए, या मानक के विनिर्देशों का एक बढ़त मामला होना चाहिए?
मुझे लगता है कि यह 'सी' कार्यों के अंदर 'ए' के लिए नाम लुकअप के कारण है।सबसे पहले यह जांचने के लिए जांच करता है कि 'उपयोग' से पहले 'सी' के दायरे में 'ए' नाम से कुछ भी घोषित किया गया है या नहीं। चूंकि इसे कोई नहीं मिलता है, इसलिए यह बेस बी के बाद से 'बी' के दायरे में इसकी जांच कर रहा है। और यदि उसे 'बी 'के दायरे में' ए' नहीं मिलता है, तो यह 'वैश्विक नामस्थान' में दिखाई देगा। लेकिन किसी भी तरह 'बी 'द्वारा' ए' की 'निजी विरासत' को दूसरी बी लुक में रोक दिया जा रहा है, जिसे' बी' के दायरे में रखा गया है। चूंकि यह 'पूरी तरह योग्य' नाम का उपयोग करके काम करता है, जिससे मुझे लगता है कि वास्तविक समस्या एक ही पंक्ति पर होनी चाहिए। – Arunmu
http://eel.is/c++draft/class.access.spec#5 प्रासंगिक लगता है –
@PiotrSkotnicki धन्यवाद, यह सीधे सवाल का जवाब देता है। लेकिन, क्या आप मुझे इस नियम के पीछे तर्कसंगत दे सकते हैं? –