2009-07-16 19 views
7

में टकरा मैं नहीं समझ सकता क्यों कोड के इस टुकड़े को संकलित नहीं करता है:नामस्थान सी ++

namespace A { 
     class F {};    // line 2 
     class H : public F {}; 
} 

namespace B { 
     void F(A::H x);   // line 7 
     void G(A::H x) { 
       F(x);   // line 9 
     } 
} 

मैं gcc 4.3.3 उपयोग कर रहा हूँ, और त्रुटि है:

s3.cpp: In function ‘void B::G(A::H)’: 
s3.cpp:2: error: ‘class A::F’ is not a function, 
s3.cpp:7: error: conflict with ‘void B::F(A::H)’ 
s3.cpp:9: error: in call to ‘F’ 

मुझे लगता है कि क्योंकि लाइन 9 में कोई नामस्थान उपसर्ग नहीं है, F(x) निश्चित रूप से केवल B::F(x) का मतलब होना चाहिए। संकलक x को अपने सुपरक्लास में डालने का प्रयास करता है। मेरी समझ में यह नहीं होना चाहिए। वह ऐसा क्यों करता है?

उत्तर

11

क्योंकि संकलक से एक ही नाम स्थान में समारोह खोज करेंगे अपने तर्कों है यही कारण है कि। कंपाइलर A::F पहचानकर्ता पाया लेकिन यह एक समारोह नहीं है। नतीजतन आपको त्रुटि मिल जाएगी।

यह जहाँ तक मैं याद कर सकते हैं मानक व्यवहार है।

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

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

यह नियम आप निम्नलिखित कोड लिखने की अनुमति देता है: क्योंकि Core Issue 218 के कुछ compilers संकलन होगा:

std::vector<int> x; 
// adding some data to x 
//... 

// now sort it 
sort(x.begin(), x.end()); // no need to write std::sort 

और अंत में बिना किसी त्रुटि के प्रश्न में कोड।

+1

तथाकथित कोएनिग लुकअप, वास्तव में, धारा 3.4 में वर्णित है।सी ++ मानक के 2। –

+0

फिर यदि वीएस इसे संकलित करता है, तो यह एक बग है? – liori

+0

क्या आप उस कथन का संदर्भ पा सकते हैं? मैंने कभी इस तरह के किसी भी नियम के बारे में नहीं सुना है ... – xtofl

4

आप अभी तक अन्य compilers उपयोग करने की कोशिश की है? यहां एक gcc bug report है जिसे निलंबित कर दिया गया है (जो भी इसका मतलब है)।

संपादित करें: कुछ शोध के बाद, मैं इस more official bug पाया।

+0

यह मेरे अपने कोड का एक न्यूनतम उदाहरण है जो मेरे मित्र के वीएस2005 पर संकलित करता है। हालांकि मैंने इस सटीक टुकड़े का परीक्षण नहीं किया है। और ... DeusAduro को VS2005 पर संकलित करने में कोई समस्या नहीं है। – liori

+0

बग रिपोर्ट इस तरह दिखती है, हालांकि इसमें टेम्पलेट्स शामिल हैं, जिनमें अभी तक एक अलग (दो चरण) लुकअप योजना है। – xtofl

+0

नोट: अन्य इस कोड को संकलित करने के लिए VS2005 की रिपोर्ट करते हैं। मैंने Comau की टेस्ट ड्राइव -> सफलता की कोशिश की। ऐसा लगता है कि केवल जीसीसी ही इससे पीड़ित है। – xtofl

1

बहुत अजीब है, मैं नकल की और वी.एस. 2005 के लिए सीधे चिपकाए और मुझे एक त्रुटि है, जो मैं उम्मीद मिलती है: :: अनसुलझे बाह्य प्रतीक "शून्य __cdecl बी एफ (क्लास ए :: एच:

त्रुटि 1 LNK2001 त्रुटि) "

क्योंकि हमने वास्तव में नामस्थान बी में एफ (एक्स) को परिभाषित नहीं किया है ... सुनिश्चित नहीं है कि जीसीसी यह त्रुटि क्यों दे रहा है।

0

मैं सिर्फ विजुअल स्टूडियो 2005 पर यह संकलन की कोशिश की और यह ठीक काम किया। मुझे आश्चर्य है कि क्या यह तर्क आश्रित लुकअप का एक टूटा कार्यान्वयन है जहां तर्कों से नामस्थान गलती से लाया गया था?

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