2013-01-04 20 views
5
struct A 
{ 
    enum InnerEnum { X }; 

    A(InnerEnum x) 
    {} 
}; 

int main() 
{ 
    A a(X); 
} 

संकलक शिकायत: error C2065: 'X' : undeclared identifierसी ++ 11 इस तरह नाम लुकअप का समर्थन क्यों नहीं करता है?

संकलक जानता है क्या निर्माता के पैरामीटर प्रकार है, इसलिए जब मैं तर्क के रूप में एक्स गुजरती हैं, संकलक पता होना चाहिए यह एक वैध तर्क है।

मुझे पता है कि यह एडीएल नहीं है (तर्क-निर्भर नाम लुकअप, जिसे कोएनिग लुकअप भी कहा जाता है), लेकिन मुझे लगता है कि यह उपयोगी और सुंदर काम है। क्योंकि मुझे निम्नानुसार लिखना नहीं है:

A a(A::X); 

मुझे लगता है कि इस तरह के मामले में एडीएल नियम सामान्यीकृत किया जाना चाहिए।

क्या मैं सही हूँ?

+2

यह एडीएल के विपरीत की तरह है ... एफडीएल (फ़ंक्शन आश्रित लुकअप)। –

+9

क्या आपने सोचा है कि यह कैसे लागू होगा जब आपके पास 'एक्स' नामक स्थानीय चर भी होगा? और इस पर ध्यान दिए बिना, जिस तरह से मैंने आपका प्रश्न पढ़ा है, आप कह रहे हैं कि यह अमान्य सी ++ है, और पूछ रहा है कि सी ++ मानक बदलना चाहिए या नहीं। इसके लिए यह गलत जगह है। – hvd

+0

धन्यवाद, एचवीडी। आपने हमें एक दृढ़ तर्क दिया है। – xmllmx

उत्तर

10

सी ++ में फ़ंक्शन कॉल फ़ंक्शन ओवरलोड रिज़ॉल्यूशन के अधीन हैं। ओवरलोड रिज़ॉल्यूशन तर्क प्रकारों द्वारा संचालित होता है। अर्थात। विशेष रूप से उस दिशा में भाषा "काम" करती है: तर्क प्रकार से दिए गए नाम के साथ फ़ंक्शन का विशिष्ट संस्करण।

आप फ़ंक्शन नाम के आधार पर एक रिवर्स प्रक्रिया - तर्क प्रकार कटौती शुरू करने का प्रस्ताव कर रहे हैं। यह सामान्य मामले में काम नहीं करेगा। यह उन मामलों में काम कर सकता है जब केवल एक उम्मीदवार कार्य होता है (जैसा कि आपके उदाहरण में है), लेकिन फिर, उन सिद्धांतों के विपरीत है जो सामान्य स्थिति में काम करते हैं जब फ़ंक्शन ओवरलोड हो जाता है।

बेशक, जब स्थिति अयोग्य नाम X पर नाम लुकअप आपके A::X के अलावा X नामक कुछ और देख सकता है तो स्थिति और भी जटिल हो जाएगी। मुझे लगता है कि यह आसानी से बहुत counterintuitive हो सकता है।

+0

मैं जटिलता तर्कों को समझता हूं जो सामान्य रूप से लागू होते हैं। तो, शायद सामान्य रूप से नहीं, लेकिन किसी कारण से मुझे लगता है कि यह 'enums' के लिए विशेष रूप से उपयोगी होगा। चूंकि वे अक्सर कार्यों के लिए मनमाने ढंग से नामित विकल्प के रूप में कार्य करते हैं। – alfC

4

मुझे लगता है कि इस तरह के मामले में एडीएल नियम सामान्यीकृत किया जाना चाहिए।

कोई धन्यवाद नहीं।

सी ++ में इसका हिस्सा (गंदा) आश्चर्य है (आपको कौन सी दूसरी भाषा पता है explicit एक कीवर्ड के रूप में आवश्यक है?), और मुझे आपके उदाहरण में पर्याप्त योग्यता दिखाई नहीं दे रही है ताकि अप्रत्याशित भाषा नियमों की इस सूची में शामिल किया जा सके। अप्रत्याशित परिस्थितियों में कोड।

यदि आपको कक्षा के नाम में अतिरिक्त टाइपिंग मिलती है तो दो कॉलन के बाद बहुत अधिक प्रयास किया जाता है, तो निश्चित रूप से सी ++ वाक्यविन्यास की सामान्य बारोक प्रकृति आपको अब तक बंद कर देनी चाहिए?