निम्नलिखित कोड पर विचार करें:नामस्थान कारण नाम छिपाने का उपयोग कर रहा है?
namespace C {
class X {};
}
namespace A {
class X {};
namespace B {
using namespace C;
X x;
}
}
मैं using namespace
निर्देश की वजह से x
के प्रकार उम्मीद कर रहा था C::X
हो सकता है, लेकिन इसके बजाय दोनों VS2010 और ऑनलाइन LLVM/बजना संकलक संकल्प X
नाम स्थान B
भीतर A::X
होने के लिए। उपयोग घोषणा (using C::X
) के साथ उपयोग निर्देश को बदलना, फिर यह C::X
को अपेक्षित के रूप में हल करता है।
मानक निर्देशों का उपयोग करने पर कहते हैं [7.3.4.2]:
एक का उपयोग कर-निर्देश निर्दिष्ट करता है कि नामित नाम स्थान में नाम गुंजाइश है, जिसमें का उपयोग कर-निर्देशों का उपयोग करने के बाद प्रकट होता है में इस्तेमाल किया जा सकता -directive। अयोग्य नाम लुकअप (3.4.1) के दौरान, नाम प्रकट होते हैं जैसे उन्हें निकटतम संलग्न नामस्थान में घोषित किया गया था जिसमें उपयोग-निर्देश और मनोनीत नामस्थान दोनों शामिल हैं।
इस बात का मेरे पढ़ने के रूप में यदि नाम स्थान B
भीतर घोषित, प्रभावी रूप से A::X
छुपा कि C::X
दिखाई देनी चाहिए है। निर्देशों का उपयोग करने और घोषणाओं का उपयोग करने के बीच मानक के कौन से खंड इस असंगतता के पीछे हैं? क्या किसी बाहरी दायरे से किसी निर्देश का उपयोग करके नाम छिपाने का कोई तरीका है?
शायद सुराग * नामों में दिखाई देता है जैसे कि उन्हें निकटतम संलग्न नामस्थान में घोषित किया गया था जिसमें ** ** ** निर्देश-निर्देश और मनोनीत नामस्थान * दोनों शामिल हैं। क्या यह '::' नहीं होगा? और यदि ऐसा है, तो 'ए :: एक्स' पहले नहीं मिलेगा (लुकअप आंतरिक नामस्थान से बाहर जाता है) ... यकीन नहीं है, लेकिन जी ++ भी' ए :: एक्स' पिकअप करता है, इसलिए यह * बहुत * कंपाइलर्स में लगातार। –
@ डेविड रोड्रिगुएज़ - ड्राईबीस: ओह, यह समझाएगा ... –