2011-08-24 13 views
5

मुझे लगता है कि कई नामस्थानों को एक साथ जोड़ने के लिए कहीं कहीं नोट्स देखना याद है।अलग-अलग नामस्थानों को लपेटना या मर्ज करना संभव है?

अब, उन नोट्स की तलाश में है जिन्हें मैं नहीं ढूंढ रहा हूं - यहां तक ​​कि खोज शब्दों को जोड़ना, समूह करना, विलय करना और लपेटना भी खोजना, मैं कुछ भी नहीं आ रहा हूं। हो सकता है कि मैंने पहले जो देखा वह गलत समझा। मेरे पास इसके लिए एक विशिष्ट अनुप्रयोग नहीं है, यह सिर्फ एक जिज्ञासा है और यह थोड़ा सा है।

लेकिन, दो नाम रिक्त स्थान ...

namespace a {int func() {return 1;}} 
namespace b {int func() {return 2;}} 

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

namespace c {namespace a{ int func2() {return 3;}} } 


int main(int argc, char **argv) 
{ 
    int a = a::func();   // normal case 
    int c = c::a::func2();  // wrapped and added to 

    //int c = c::func2();  // doesn't work 
    //int d = a::func2();  // doesn't work 
} 

सवाल कर रहे हैं:

1) वहाँ वाक्य रचना कि सिर्फ एक नया एक में दो रिक्त स्थान को जोड़ती है?

2) क्या स्पेस को सबस्पेस में जोड़ने के बिना एक वाक्यविन्यास है?

+1

मैं तुम्हें 'डाल नाम स्थान का उपयोग कर सकता है लगता है एक;' 'b' में लेकिन फ़ंक्शन नाम ओवरलैपिंग समस्याओं का कारण बन सकता है। – GWW

+0

इसका क्या मतलब होगा? – Rhexis

+0

@ फ्लीफे - ऊपर दिए गए प्रश्न से उद्धरण के लिए: * मेरे पास इसके लिए एक विशिष्ट अनुप्रयोग नहीं है, यह सिर्फ एक जिज्ञासा है और यह थोड़ा सा है। * – Arbalest

उत्तर

6

आप ऐसा कर सकते हैं:

namespace c 
{ 
    using namespace a; 
    using namespace b; 
} 

लेकिन अगर ए और बी एक ही नाम के साथ तत्वों है, तो आप उन्हें नाम स्थान ग से उपयोग करने में सक्षम नहीं होगा। कि विरोध नहीं आप प्राप्त करने के साथ नाम के लिए

namespace c 
{ 
    inline namespace a { using namespace ::a; } 
    inline namespace b { using namespace ::b; } 
} 

इस तरह:

namespace c { 
    namespace a { using namespace ::a; } 
    namespace b { using namespace ::b; } 
} 
+0

धन्यवाद। उन लोगों के लिए एक नोट छोड़ने के लिए जो बाद में देख सकते हैं - उपयोग वाक्यविन्यास है: 'int a = c :: func(); 'नामकरण विवादों के लिए अन्य उत्तर देखें। – Arbalest

4

आप एक नया इस तरह से एक में नामस्थान लपेट कर सकते हैं केवल c द्वारा और आप क्वालिफ़िंग c::a या c::b द्वारा विवादों को हल कर सकते हैं।

उदा .:

namespace a 
{ 
    auto foo_a() { cout << "a::foo_a" << endl; } 
    auto foo() { cout << "a::foo" << endl; } 
} 
namespace b 
{ 
    auto foo_b() { cout << "b::foo_b" << endl; } 
    auto foo() { cout << "b::foo" << endl; } 
} 

namespace c 
{ 
    inline namespace a { using namespace ::a; } 
    inline namespace b { using namespace ::b; } 
} 

int main() 
{ 
    c::foo_a(); 
    c::foo_b(); 

    c::a::foo(); 
    c::b::foo(); 

    return 0; 
} 
+0

यह एक समान अच्छा समाधान है। यह नामों को अर्हता प्राप्त करने के लिए थोड़ा और टाइपिंग मांगता है लेकिन यह एक अच्छी बात हो सकती है, खासकर यदि उप-स्थानों में नाम 'int a = c :: a :: func(); ' – Arbalest

5

सी ++ 11 के बाद से सबसे अच्छा समाधान है:

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

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