C++
तर्क निर्भर नाम लुकअप
खोज…
क्या कार्य पाए जाते हैं
कार्य पहले "संबद्ध वर्ग" और "संबंधित नामस्थान" का एक सेट एकत्र करके पाया जाता है जिसमें तर्क प्रकार T
आधार पर निम्नलिखित में से एक अयस्क अधिक होता है। सबसे पहले, हमें कक्षाओं, गणना और वर्ग टेम्पलेट विशेषज्ञता नामों के नियम दिखाते हैं।
- यदि
T
एक नेस्टेड क्लास, मेंबर एन्यूमरेशन है, तो उसके आसपास का क्लास। - यदि
T
एक गणन है (यह एक वर्ग का सदस्य भी हो सकता है!), इसका अंतरतम नामस्थान है। - यदि
T
एक वर्ग है (यह भी नेस्टेड हो सकता है!), इसके सभी आधार वर्ग और स्वयं कक्षा। सभी संबद्ध वर्गों का अंतरतम नामस्थान। - यदि
T
एकClassTemplate<TemplateArguments>
(यह भी एक वर्ग है!), टेम्पलेट प्रकार के तर्कों से जुड़े वर्ग और नामस्थान, किसी टेम्पलेट टेम्पलेट तर्क के नामस्थान और किसी टेम्पलेट टेम्पलेट तर्क के आसपास के वर्ग के तर्क। एक सदस्य टेम्पलेट।
अब बिलिन प्रकार के लिए भी कुछ नियम हैं
- अगर
T
करने के लिए एक सूचक हैU
या की सरणीU
, वर्गों और के साथ जुड़े नामस्थानU
। उदाहरण:void (*fptr)(A); f(fptr);
,void(A)
जुड़े नामस्थान और कक्षाएं शामिल हैं (अगला नियम देखें)। - यदि
T
एक फ़ंक्शन प्रकार है, तो पैरामीटर और रिटर्न प्रकार से जुड़े वर्ग और नाम स्थान। उदाहरण:void(A)
मेंA
जुड़े नाम स्थान और वर्ग शामिल होंगे। - यदि
T
सदस्य के लिए एक संकेतक है, तो सदस्य प्रकार से जुड़े वर्ग और नाम स्थान (सदस्य सदस्य के लिए सूचक और डेटा सदस्य के लिए सूचक दोनों पर लागू हो सकते हैं!)। उदाहरण:BA::*p; void (A::*pf)(B); f(p); f(pf);
A
,B
,void(B)
जुड़े नामस्थान और कक्षाएं शामिल हैं (जो फ़ंक्शन प्रकारों के लिए ऊपर बुलेट लागू करता है)।
सभी फ़ंक्शन और सभी संबंधित नामस्थान के भीतर टेम्पलेट तर्क पर निर्भर लुकअप द्वारा पाए जाते हैं। इसके अलावा, संबंधित कक्षाओं में घोषित नाम-स्थान-फ्रेंड फ़ंक्शंस पाए जाते हैं , जो सामान्य रूप से दिखाई नहीं देते हैं। निर्देशों का उपयोग करते हुए नजरअंदाज कर दिया जाता है।
निम्नलिखित सभी उदाहरण कॉल वैध हैं, बिना कॉल में नाम स्थान के नाम से f
क्वालीफाई किए बिना।
namespace A {
struct Z { };
namespace I { void g(Z); }
using namespace I;
struct X { struct Y { }; friend void f(Y) { } };
void f(X p) { }
void f(std::shared_ptr<X> p) { }
}
// example calls
f(A::X());
f(A::X::Y());
f(std::make_shared<A::X>());
g(A::Z()); // invalid: "using namespace I;" is ignored!
Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow