2012-08-08 14 views
9

नीचे दिए गए सी ++ कोड में, 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; 
    } 
}; 

उत्तर

8

Argument dependent lookup

Foo के नामस्थान से foobar(f) कॉल में कॉल पर विचार किया जाएगा।

double के लिए काम नहीं करता है क्योंकि उस प्रकार किसी भी नामस्थान में घोषित नहीं किया गया है।

+0

अंतिम वाक्य के अतिरिक्त के रूप में: अयोग्य नाम लुकअप जैसे ही यह एक मिलान * नाम * पाता है, पहले स्थानीय स्कॉप्स पर विचार करता है और केवल तभी जब उसे कोई नाम नहीं मिलता है तो यह ऊपरी और वैश्विक क्षेत्रों को खोजेगा । – Xeo

+0

धन्यवाद बो। एडीएल का लिंक चीजों को स्पष्ट करता है। – user2023370

+0

@Xeo: क्या यह इंगित नहीं करेगा कि 'foobar (f)' को कॉल 'foobar (बार b)' खोजने में विफल रहेगा? – user2023370

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