2011-08-24 53 views
5

我似乎記得在將多個名稱空間合併爲一個的方式中,在某處看到筆記。可能包裝或合併單獨的名稱空間?

現在,尋找說的筆記我沒有找到他們 - 甚至搜索使用搜索條件梳理,分組,合併和包裝我沒有提出任何事情。也許我誤解了我之前看到的。 我沒有具體的應用程序,這只是一個好奇心,它有點人爲的。

但是,從2個開始的名字空間...

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

@Flyphe - 引用上面的問題:*我沒有具體的應用程序,這只是一個好奇心,它有點人爲的。* – Arbalest

回答

6

你可以這樣做:

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

但是,如果A和B具有相同名稱的元素,你將無法從命名空間C使用它們。

+0

謝謝。對於那些稍後可能會看到的人來說,使用語法是:'int a = c :: func(); '看到命名衝突時的其他答案。 – Arbalest

4

你可以用的命名空間中的一個新的這樣的:用於地名

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 :: a :: func();' – Arbalest

5

因爲C++ 11的最好的解決辦法是隻有c,您可以通過資格c::ac::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; 
} 
相關問題