मुझे तर्क-निर्भर (कोएनिग) लुकअप के पीछे नियमों को समझने में परेशानी हो रही है।तर्क-निर्भर लुकअप - यह कब किया जाता है, क्या खोजा जाता है, और आप इसे कैसे रोक सकते हैं (या रोक सकते हैं)?
नीचे कोड पर विचार करें:
#include <iostream>
using namespace std;
namespace adl
{
struct Test { };
void foo1(Test const &) { cout << "ADL used (foo1)" << endl; }
void foo2(Test const &) { cout << "ADL used (foo2)" << endl; }
void foo3(Test const &) { cout << "ADL used (foo3)" << endl; }
}
struct foo1
{
foo1() { }
template<class T>
foo1(T const &) { cout << "ADL not used (foo1)" << endl; }
template<class T>
void operator()(T const &) const { cout << "ADL not used (foo3)" << endl; }
};
template<class T> void foo2(T const &)
{ cout << "ADL not used (foo2)" << endl; }
int main()
{
adl::Test t;
foo1 foo3;
(foo1(t));
(foo2(t));
(foo3(t));
}
इसका उत्पादन होता है: इस्तेमाल किया
ADL नहीं (
foo1
)
ADL इस्तेमाल किया (foo2
)
ADL इस्तेमाल नहीं किया (foo3
)
मैं ई उन सभी को एडीएल का उपयोग करने का अनुमान लगाया, लेकिन मुझे आश्चर्य हुआ कि उनमें से कुछ ने ही किया था।
ADL के नियमों के पीछे क्या हैं (संभावित रक्तमय, मुझे पता है) विवरण?
मैं इस अवधारणा को काफी अच्छी तरह समझता हूं, लेकिन विवरण वह है जो मुझे परेशानी हो रही है।
कौन सा स्कॉप्स खोजे जाते हैं, उन्हें कब खोजा जाता है, और जब वे खोज नहीं जाते हैं?
यह बिल्कुल ADL कोड की दी गई लाइन से पहले सभी#include
'घ फ़ाइलों के माध्यम से देखने के लिए बिना प्रयोग किया जाता है कि क्या यह बताने के लिए संभव है? मुझे आशा है कि एडीएल मास्किंग के मामले में मज़दूरों और कार्यों का व्यवहार उसी तरह से व्यवहार न करें, लेकिन स्पष्ट रूप से वे नहीं करते हैं।
क्या बल एडीएल का कोई तरीका है जहां यह स्वचालित रूप से नहीं किया जाता है (जैसे ऊपर) और आप कक्षा के नामस्थान (उदा। टेम्पलेट में) नहीं जानते हैं?
-1 यह प्रश्न बहुत व्यापक है, और कोड उदाहरण वास्तव में बेकार (भ्रामक नाम आदि के साथ) बेकार है। –
मुझे यह नहीं मिला। आप '(foo3 (टी)) के साथ प्रयोग क्यों कर रहे हैं;'? 'Foo3' नामक कोई फ़ंक्शन नहीं है। तो एडीएल तस्वीर में नहीं आता है। 'foo3' को बिना किसी संदेह के ऑब्जेक्ट के रूप में माना जाएगा, क्योंकि यह वही है (जिसका अर्थ है कि यह बिना किसी संदेह के 'ऑपरेटर()' को कॉल करेगा)! यह सिर्फ आपके नाम में उपयोग किए जाने वाले भ्रामक नाम हैं। – Nawaz
@ चीयर्संधथ-अल्फ: लेकिन '(foo3 (टी)) पर कोई भ्रम नहीं है; '। यह सिर्फ इतना है कि उन्होंने परिवर्तनीय के लिए भ्रामक नामों का उपयोग किया है! – Nawaz