Wie importieren Sie eine enum in einem anderen namespace in C++?

Habe ich eine enum in einem namespace, und ich möchte es verwenden, als ob es waren in einem anderen namespace. Intuitiv dachte ich mir, ich könnte 'mit' oder 'typedef', um dies zu erreichen, aber weder wirklich funktionieren. Code-snippet, um es zu beweisen, getestet auf GCC und Sun-CC:

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;
}

Das problem ist, dass die enum-selbst importiert, aber keines Ihrer Elemente. Leider kann ich es nicht ändern, die ursprüngliche enum zu sein, eingehüllt in eine dummy-namespace oder die Klasse, ohne zu brechen viele der anderen vorhandenen code. Die beste Lösung, die ich denken kann, ist manuell zu reproduzieren, die enum:

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

Aber es verstößt gegen die DRY-Prinzip. Gibt es einen besseren Weg?

  • "Aber es verstößt gegen das DRY-Prinzip." In diesem Fall würde ich überdenken mit dem Prinzip. "Gibt es einen besseren Weg?" enums (leider) nicht Bereiche, aber Sie können die enum-Elemente in zusätzliche Struktur oder namespace.
  • Leider viel anderen code basiert auf der ursprünglichen enum nicht in einem anderen Bereich :/
  • OHA... Hatte mich jemand gefragt, so etwas wie, dass, ich würde beantwortet haben, sollte es geklappt haben. Vielen Dank für die Aufdeckung dieser dunklen Ecke von C++... +1.
  • Beachten Sie, dass dies noch ein weiterer Grund zu wickeln Enumerationen, die in Ihrem eigenen namespace oder struct (für pre-C++0x-code)...
  • "Leider viel anderen code basiert auf der ursprünglichen enum nicht in einem anderen Bereich", auch ist es möglich zu beheben "anderer code" - wenn Sie enum in Umfang und alles neu erstellen, erhalten Sie Fehler bei der Kompilierung, der Punkt, an Orten, wo Enumerationen, die behoben werden sollten. Es ist eine gefährliche operation (Sie können dazu führen, dass massive Versager durch einen Tippfehler), aber es kann getan werden. Enums, die außerhalb der Bereiche verschmutzen namespaces, so ist es möglich, dass Sie haben, um Sie in Bereiche, die in Zukunft sowieso...
  • Unter C++11, buzz::bar y = buzz::bar::A; funktioniert.

Schreibe einen Kommentar