2009-07-10 17 views
6

सी ++ में आप अज्ञात नेमस्पेस के अंदर अपनी कक्षा और फ़ंक्शन परिभाषाओं को लपेटकर आंतरिक लिंक निर्दिष्ट करते हैं। आप टेम्पलेट्स को स्पष्ट रूप से तत्काल भी कर सकते हैं, लेकिन टेम्पलेट्स के किसी भी स्पष्ट तत्कालता के अनुरूप मानकों के अनुरूप एक ही नामस्थान में होना चाहिए। AFAICT इस संकलन करना चाहिए, लेकिन जीसीसी उस पर विफल रहता है:क्या अनाम नामस्थान सभी नामस्थान संलग्न करता है?

namespace foo { 

template<class T> 
class bar {}; 

} 

using namespace foo; 

namespace { 
template class bar<int>; 
} 

int main() 
{ 
    return 0; 
} 
त्रुटि के साथ

:

namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace 'foo') 

जो दिलचस्प है क्योंकि गुमनाम नाम स्थान सिर्फ लिंकेज को निर्दिष्ट किया जाना चाहिए, नहीं सच में एक नाम स्थान के रूप में कार्य है, और ग्लोबल नेमस्पेस निश्चित रूप से foo संलग्न करता है, क्योंकि यह प्रत्येक नेमस्पेस को संलग्न करता है। लेकिन फिर भी यह काम नहीं करता !:

template<class T> 
class bar {}; 

using namespace foo; 

namespace { 
template class bar<int>; 
} 

int main() 
{ 
    return 0; 
} 

बस के बजाय वैश्विक नामस्थान लिस्टिंग एक ही त्रुटि के साथ विफल कौन सा,:

namespace_test.cpp:11: error: explicit instantiation of 'class bar<int>' in namespace '<unnamed>' (which does not enclose namespace '::') 

:/

+0

जीसीसी का कौन सा संस्करण - या कौन सा कंपाइलर विकल्प - या कौन सा मंच? मैंने मैकोज़ एक्स पर जी ++ 4.0.1 के साथ पहले नमूने की कोशिश की और बिना -वॉल और यह शिकायत या चेतावनी के बिना संकलित किया गया। सोलारिस पर –

+0

जीसीसी 4.2। –

उत्तर

10

एक अनाम नाम स्थान तार्किक

namespace _TU_specific_unique_generated_name 
{ 
    // ... 
} 
using namespace _TU_specific_unique_generated_name; 

के बराबर एक नाम स्थान, अनाम है या अन्यथा, अपने सदस्यों के संबंध पर कोई प्रभाव नहीं है। अज्ञात नेमस्पेस के विशेष सदस्यों में जादुई रूप से आंतरिक संबंध नहीं मिलता है।

+1

मैं स्पष्ट जोड़ दूंगा, यह है कि _TU_specific_unique_generated_name में सामान फ़ाइल के बाहर उपयोग नहीं किया जा सकता है। – Valentein

+0

यह वास्तव में मानक, स्वीकार्य में इस सटीक तरीके से वर्णित है। –

6

मुझे लगता है कि आप अपने जवाब है - अनाम नामस्थान अलग, अद्वितीय नामस्थान हैं। बीटीडब्ल्यू, संकलक आंतरिक रूप से नामस्थान का प्रतिनिधित्व करने के लिए कुछ यादृच्छिक बड़े पूर्णांक उत्पन्न करता है।

0

स्ट्राउस्ट्रप (सेक्शन 8.2.5.1) के अनुसार वैश्विक नामस्थान में अज्ञात (अनामित) नामस्थान तक पहुंच है, लेकिन यह स्पष्ट रूप से विपरीत नहीं कहता है।

मैं उम्मीद आप एक बयान का उपयोग कर के साथ नामस्थान निर्दिष्ट या पूरी तरह से अज्ञात नाम स्थान के अंदर अन्य नामस्थान के लिए संदर्भ में अर्हता प्राप्त करना होगा ...

7

पहले: आप स्पष्ट रूप से एक वर्ग टेम्पलेट instantiating रहे हैं, आप को परिभाषित नहीं कर रहे हैं एक नया वर्ग टेम्पलेट।

template class bar<int>; 

कहता है "कृपया यहां टाइप प्रकार के लिए क्लास टेम्पलेट बार को तुरंत चालू करें"। आप इसे किसी अन्य नेमस्पेस में नहीं कर सकते, जैसे कि आप आंशिक रूप से किसी अन्य नामस्थान में क्लास टेम्पलेट का विशेषज्ञ नहीं हो सकते हैं। विशेष रूप से, टेम्पलेट को स्पष्ट रूप से तत्काल करने के लिए परिभाषित किया जाना चाहिए, और आपके उदाहरण में, कोई (अनाम नामस्थान) :: बार <> है, केवल foo :: bar <>।

दूसरा: अनाम नामस्थान वास्तविक नामस्थान है (हालांकि यह प्रत्येक अनुवाद इकाई में विशिष्ट है)। यह जादुई रूप से जुड़ाव भी नहीं बदलता है। नेमस्पेस {} के अंदर घोषित सबकुछ अभी भी डिफ़ॉल्ट लिंकेज है, बस किसी अन्य नेमस्पेस स्कोप की तरह। आईआईआरसी, इसे अनुवाद इकाई-निजी, अभी तक बाहरी-लिंक ऑब्जेक्ट्स की अनुमति देने के लिए भी जोड़ा गया था।

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