2010-07-20 30 views
24

我在命名空間中有一個枚舉,我想將它用在不同的命名空間中。直覺上,我想我可以使用'使用'或'typedef'來實現這一點,但實際上都沒有效果。代碼片段來證明這一點,在海灣合作委員會和Sun CC測試:如何將枚舉導入C++中的其他名稱空間?

namespace foo 
{ 

enum bar { 
    A 
}; 

} 

namespace buzz 
{ 
// Which of these two methods I use doesn't matter, 
// the results are the same. 
using foo::bar; 
//typedef foo::bar bar; 
} 

int main() 
{ 
    foo::bar f; // works 
    foo::bar g = foo::A; // works 

    buzz::bar x; // works 
    //buzz::bar y = buzz::A; // doesn't work 
    buzz::bar z = foo::A; 
} 

的問題是,枚舉本身是進口的,但沒有的元素。不幸的是,我無法將原始枚舉更改爲包含在額外的虛擬名稱空間或類中,而不會破壞大量其他現有代碼。我能想到的最好的解決方法是手動重現枚舉:

namespace buzz 
{ 
enum bar 
{ 
    A = foo::A 
}; 
} 

但它違反了DRY principle。有沒有更好的辦法?

+0

「但它違反了DRY原則。」在這種情況下,我會重新考慮使用該原則。 「有沒有更好的辦法?」枚舉(不幸)不是作用域,但可以將枚舉元素放入其他結構或名稱空間中。 – SigTerm 2010-07-20 19:08:05

+0

不幸的是很多其他代碼依賴於原始枚舉不在另一個範圍內:/ – 2010-07-20 19:10:27

+1

哇......有人問過我這樣的事情,我會回答它應該工作。感謝您揭示C++的這個黑暗角落... +1。 – paercebal 2010-07-20 19:21:44

回答

22

將現有命名空間封裝在嵌套命名空間中,然後在原來的命名空間中「使用」。

namespace foo 
{ 
    namespace bar_wrapper { 
     enum bar { 
      A 
     }; 
    } 
    using namespace bar_wrapper; 
} 

namespace buzz 
{ 
    using namespace foo::bar_wrapper; 
} 
5

這裏的問題是using聲明只引用枚舉的名稱,而不是其值的名稱。 Enum's不是示波器,也沒有攜帶 枚舉器的名稱。我不認爲有可能自己導入枚舉值。嘗試將枚舉包裝在struct/namespace中並使用它。

+3

方面評論:在C++ 0x枚舉是*類的*上下文,通過它你可以訪問枚舉值。 'enum A {a,b}; A :: a;'將是有效的代碼,並且一旦到位,簡單的'using'或'typedef'方法就可以工作:'namespace A {enum X {a,b}; } namespace B {using A :: X; } int main(){B :: X x = B :: X :: a; }' – 2011-07-01 08:18:03

1

如果您確實需要這樣做,請嘗試using namespace foo;而不是using foo::bar;。但是,將枚舉封裝在類或其他名稱空間中是一個更好的主意。

8

雖然我喜歡標記B最好的方法,因爲它不會破壞現有的代碼,你也可以做到以下幾點:

 
namespace foo { 
enum bar { 
    A, B [..] 
}; 
} 

namespace buzz { 
using foo::bar; 
using foo::A; 
using foo::B; 
[..] 
} 
1

從開始C++ 11可以使用enum class 。導入enum class進口的所有值:

namespace foo 
{ 

enum class bar { 
    A 
}; 

} 

namespace buzz 
{ 
using foo::bar; 
} 

int main() 
{ 
    foo::bar f; 
    foo::bar g = foo::bar::A; 

    buzz::bar x; 
    buzz::bar y = buzz::bar::A; 
    buzz::bar z = foo::bar::A; 
} 

上面的代碼編譯成功:http://coliru.stacked-crooked.com/a/2119348acb75d270