我在命名空間中有一個枚舉,我想將它用在不同的命名空間中。直覺上,我想我可以使用'使用'或'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。有沒有更好的辦法?
「但它違反了DRY原則。」在這種情況下,我會重新考慮使用該原則。 「有沒有更好的辦法?」枚舉(不幸)不是作用域,但可以將枚舉元素放入其他結構或名稱空間中。 – SigTerm 2010-07-20 19:08:05
不幸的是很多其他代碼依賴於原始枚舉不在另一個範圍內:/ – 2010-07-20 19:10:27
哇......有人問過我這樣的事情,我會回答它應該工作。感謝您揭示C++的這個黑暗角落... +1。 – paercebal 2010-07-20 19:21:44