2012-09-05 13 views
7

में तर्क-निर्भर लुकअप यह कैसे काम करता है? क्या यह एडीएल से संबंधित है?सी ++

#include <iostream> 

template <typename T> 
struct A 
{ 
    friend void f(T x) 
    { 
     std::cout << "A\n"; 
    } 
}; 

int main() 
{ 
    f(new A<void*>()); 
} 

किसी ने मुझसे क्यों मैं

f(A<int>()); 
+0

शब्द 'एक परिभाषा friend' होने IIRC सही नहीं है। – chris

+0

@ क्रिस: नहीं, यह ठीक है। –

+0

@ जेसे गुड, आह, इसे मिला। मुझे कुछ और सोचना चाहिए। मुझे ऐसा कुछ याद है जैसे इसके खिलाफ मानक में स्पष्ट रूप से स्पष्ट बयान है। – chris

उत्तर

13
f(new A<void*>());  

की तरह कुछ का उपयोग नहीं कर बता सकते हैं वास्तव में काम करता है क्योंकि Argument dependent lookup/Koenig lookup (ADL)
कोएनिग लुक राज्यों के :

फ़ंक्शन के नामस्थान में एक या अधिक तर्क प्रकार परिभाषित किए जाने पर आपको फ़ंक्शंस के लिए नेमस्पेस (स्कोप) अर्हता प्राप्त करने की आवश्यकता नहीं है।

पर विचार करें एक simplistic example टेम्पलेट का उपयोग कर नहीं है और यह मदद करनी चाहिए आप बेहतर काम पर ADL समझते हैं:

#include <iostream> 
struct A 
{ 
    friend void f(A x) 
    { 
     std::cout << "A\n"; 
    } 
}; 

int main() 
{ 
    f(A()); 
    return 0; 
} 

आउटपुट:

A 

जब आप f(A<int>()) उपयोग करें, यह है कि f() जनादेश int प्रकार के तर्क की आवश्यकता है, लेकिन आपकी संरचना कोई रूपांतरण प्रदान नहीं करती है A से int और इसलिए त्रुटि से।

If you provide the appropriate conversion then it will work as well. Something like:

operator int(){return 1;} 
+0

मैं एफ का उपयोग क्यों नहीं कर सकता (ए ()) ;? – FrozenHeart

+0

मुझे एडीएल के साथ क्या करना है यह नहीं मिलता है। वह अन्यथा नामस्थान को कैसे अर्हता प्राप्त कर सकता है? – 0x499602D2