名前空間に列挙型があり、別の名前空間にあるかのように使用したいと思います。直感的には、「using」または「typedef」を使用してこれを実現できると思いましたが、どちらも実際には機能しません。それを証明するコードスニペット。GCCとSunCCでテストされています。
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の原則に違反しています。もっと良い方法はありますか?