2016-06-15 7 views
2

Ich habe einige Probleme beim Zugriff auf Enums, die in Namespaces eingeschlossen sind.Auf eine Enumeration im Namespace zugreifen

Mein Problem ist, dass ich zwei Namespaces für zwei verschiedene Implementierungen eines Algorithmus habe. Das Problem ist, dass ich zwei Enums für die Modi in jedem Namespace habe, die jeweils ein wenig anders sind. In einer Datei möchte ich die beiden Implementierungen vergleichen. Das Problem besteht darin, dass ich die Enums dann nicht ohne die beiden Kollisionen verwenden kann. Kann man beschreiben, wie ich dies zu tun, ohne using namespace gehen könnte

namespace implementation1{ 
enum modes {mode_standard, mode_special, fast_mode} 
} 
namespace implementation2{ 
enum modes {mode_default, mode_repeat, fast_mode} 
} 

Hinweis dies nur ein Beispiel Mine ist ein wenig komplexer, aber es zeigt, was ich tun möchte. Ich möchte versuchen, es auf diese Weise zu lösen, anstatt es in eine globale Enumeration umzuwandeln oder die Moden umzubenennen, obwohl das eine Option ist, wenn es keinen anderen Weg gibt.

+1

Haben Sie versucht namespace1 :: mode1? Hat es funktioniert? Wenn nicht, was war das tatsächliche Ergebnis? Im Allgemeinen greifen Sie auf eine Enumeration genauso zu, wie Sie auf einen anderen Namen zugreifen würden. –

+0

Danke ich denke, dass es ging. Ich hatte dieses Konzept missverstanden, als ich versuchte, dies auszuarbeiten. Danke für die Hilfe (ich bin noch ziemlich neu mit Namespaces) – Dast99

Antwort

3

Ich bin mir nicht sicher, was ist dein Problem, aber diese Arbeit in Ordnung für dich? wenn nicht, bitte erarbeiten mehr am Beispiel:

namespace implementation1 { 
enum modes { mode_standard, mode_special, fast_mode }; 
} 
namespace implementation2 { 
enum modes { mode_default, mode_repeat, fast_mode }; 
} 

int main(int argc, char *argv[]) { 
    if (implementation1::fast_mode == implementation2::fast_mode) { // foo mode use... 
    } 
    return 0; 
} 

eine enum Aktualisierung können Sie Ihre „Äquivalenz“ brechen:

namespace implementation1 { 
enum modes { mode_standard, mode_special, fast_mode }; 
} 
namespace implementation2 { 
enum modes { first_mode, mode_default, mode_repeat, fast_mode }; 
} 

int main(int argc, char *argv[]) { 
    // foo mode use... this not work now 
    if (implementation1::fast_mode == implementation2::fast_mode) { 
    } 
    return 0; 
} 

Die enum Werte automatisch zugewiesen werden, wenn Sie die enum s von seinem vergleichen müssen Name Sie müssen manuell den "zugewiesenen Wert" manuell eingeben:

namespace implementation1 { 
enum modes { mode_standard, mode_special, fast_mode = 3 }; 
} 
namespace implementation2 { 
enum modes { first_mode, mode_default, mode_repeat, fast_mode = 3 }; 
} 

aber es ist fehleranfällig, ich empfehle dringend nicht Verwenden Sie dies, wenn Sie Informationen dazu benötigen Ich empfehle read über die Motivationen über die neue scoped enums (zB: enum class), erhältlich von C++ 11.

+0

Wie ich in meinem Kommentar erwähnt habe. Ich habe versucht herauszufinden, wie ich auf das Enum selbst zugreifen kann. Allerdings habe ich eine Frage, wenn ich zwei Enums die gleichen Werte innerhalb von zwei verschiedenen Namespaces geben würde, wären sie gleichwertig (zB sind beide bis auf Namespace identisch) – Dast99

+0

Ich wurde aktualisiert mein Beitrag, bitte lesen Sie weiter ... –

+0

Danke für die update, ich werde mich darum kümmern – Dast99

Verwandte Themen