नीचे दिए गए सी ++ कोड में, foobar
को पहले double
पैरामीटर के लिए परिभाषित किया गया है, और फिर Foo
प्रकार के एक पैरामीटर के लिए पहले परिभाषित किया गया है। दोनों को वैश्विक नामस्थान के भीतर परिभाषित किया गया है।सी ++ वैश्विक नामस्थान किसी अन्य नामस्थान के भीतर से
one
नामस्थान के भीतर, foobar
का एक और अधिभार परिभाषित किया गया है, Bar
के एक पैरामीटर के साथ। foobar
के इस संस्करण से, foobar
पर double
तर्क (42.0) के साथ एक अयोग्य कॉल विफल हो जाएगी। foobar
पर एक समान कॉल, इस बार (: :) स्कोप रिज़ॉल्यूशन ऑपरेटर के साथ योग्यता, double
तर्क के साथ भी योग्य है, हालांकि सफल होगा।
दूसरी ओर, के तर्क के साथ foobar
पर एक अयोग्य कॉल, सफल होता है। foobar
पर Foo
तर्क के साथ कॉल, स्कोप रिज़ॉल्यूशन ऑपरेटर द्वारा योग्यता, भी सफल होता है।
दो परिदृश्य अलग-अलग व्यवहार क्यों करते हैं? मैं जीसीसी 4.7 और क्लैंग ++ 3.2 दोनों का उपयोग करता हूं।
struct Foo {};
struct Bar {};
double foobar(double x) { return x; }
Foo foobar(Foo f) { return f; }
namespace one {
Bar foobar(Bar b) {
//foobar(42.0); // error: can't convert to Bar
::foobar(42.0);
Foo f;
foobar(f); // no problem
::foobar(f);
return b;
}
};
अंतिम वाक्य के अतिरिक्त के रूप में: अयोग्य नाम लुकअप जैसे ही यह एक मिलान * नाम * पाता है, पहले स्थानीय स्कॉप्स पर विचार करता है और केवल तभी जब उसे कोई नाम नहीं मिलता है तो यह ऊपरी और वैश्विक क्षेत्रों को खोजेगा । – Xeo
धन्यवाद बो। एडीएल का लिंक चीजों को स्पष्ट करता है। – user2023370
@Xeo: क्या यह इंगित नहीं करेगा कि 'foobar (f)' को कॉल 'foobar (बार b)' खोजने में विफल रहेगा? – user2023370