2012-03-22 7 views
5

निम्नलिखित स्रोत कोड विजुअल स्टूडियो 2010 के साथ सही ढंग से संकलित पर संकलन नहीं करना चाहिए:कोड विजुअल स्टूडियो 2010 में संकलित लेकिन सभी

namespace NS 
    { 
    class X 
     { 
     }; 
    X Y(X str); 
    } 

void myFun() 
    { 
    NS::X x; 
    Y(x); 
    } 

(यह कम हो जाता है कोड जहां मेरे सारे ही वर्ग और समारोह के नाम बदल दिया गया है एक्स, वाई, ...)

मुझे उम्मीद है कि Y(x) लाइन संकलित करने में विफल रहेगी, क्योंकि यह NS::Y(x) होना चाहिए।

इस स्रोत कोड निम्न आदेश के साथ संकलित किया गया है

cl /c file.cpp 

कोई अन्य फ़ाइलों यहाँ शामिल, कोई अन्य आदेश पंक्ति विकल्प हैं।

यह फ़ाइल संकलित क्यों करती है? वीएस -2010 में बग? या कुछ जो मैंने (और मेरे 3 अन्य सहयोगियों) को अनदेखा किया?

+1

ने इसे g ++ के साथ करने की कोशिश की और एनएस :: वाई (एनएस :: एक्स) 'के लिए अनिर्धारित संदर्भ प्राप्त किया - शायद यह वीएस में एक बग हो सकता है .. – WeaselFox

+2

http://ideone.com/WzC6V –

+0

@WeaselFox : पूरी तरह से असंबंधित। आपकी त्रुटि एक * लिंकर त्रुटि * है क्योंकि 'NS :: Y' परिभाषित नहीं है। यह सामान्य है, और शायद एक पूर्ण फ़ाइल पर एक और फाइल में परिभाषित किया जाएगा। –

उत्तर

9

आप जो अनुभव कर रहे हैं ADL (Argument Dependent Lookup) के कारण है।

आपके स्निपेट के साथ कुछ भी गलत नहीं है (इस तथ्य के अलावा कि लिंकर शायद NS::Y को परिभाषित नहीं करेगा), लेकिन इसे संकलित करना चाहिए - वीएस2012 स्निपेट को संभालना है जैसा इसे करना चाहिए।

संकलक NS::Y को इस तथ्य के कारण मिलेगा कि पैरामीटर x (NS::X) उचित दायरे में है।


3.4.2तर्क पर निर्भर नाम देखने [basic.lookup.argdep]

  1. जब एक अयोग्य नाम एक में पोस्टफ़िक्स-अभिव्यक्ति के रूप में प्रयोग किया जाता है फ़ंक्शन कॉल (5.2.2), सामान्य अयोग्यता लुकअप (3.4.1) के दौरान अन्य नामस्थानों को नहीं माना जा सकता है, और उनमेंनेमस्पेस, नेमस्पेस-स्कोप मित्र फ़ंक्शन घोषणाएं (11.4) अन्यथा दिखाई दे सकती है।

    खोज में ये संशोधन तर्कों (और टेम्पलेट टेम्पलेट तर्कों के लिए, टेम्पलेट तर्क का नामस्थान) के प्रकारों पर निर्भर करता है।

  2. फ़ंक्शन कॉल में प्रत्येक तर्क प्रकार टी के लिए, शून्य या अधिक संबंधित नामस्थानों का एक सेट और शून्य या अधिक संबंधित वर्गों का एक सेट माना जाता है।

    नामस्थानों और कक्षाओं के सेट पूरी तरह से फ़ंक्शन तर्क (और किसी भी टेम्पलेट टेम्पलेट तर्क का नामस्थान) के प्रकारों द्वारा निर्धारित किए जाते हैं।

+0

आप सही हैं, मैंने इसे विकिपीडिया पर भी पाया है। मुश्किल। मुझे यह काम करने की उम्मीद नहीं थी। – Patrick

+0

तो क्या यह एमएसवीएस या जीसीसी में एक बग है? –

+2

@LuchianGrigore कोई बग नहीं है, स्निपेट संकलन। लिंकर को 'एनएस :: वाई' की परिभाषा नहीं मिल सकती है। निष्पादन योग्य बनाने के दौरान कई कदम हैं। –

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