Ich verwende einen Namespace, um zwischen verschiedenen Versionen meiner Datenbankimplementierung zu wechseln. Mein Client-Code sollte die Details nicht kennen müssen, daher verwende ich einen Namespace-Alias, um die bestimmte Version vor dem Client-Code zu verbergen.Hinzufügen von Elementen zu einem Aliasnamen-Namespace
db_v1.h
namespace db_v1
{
class Database ...
}
db_def.h
#ifdef _DB_V1
#include "db_v1.h"
#endif
namespace db = db_v1;
Wenn ich nun den Namensraum mit zusätzlichen Elemente erweitern möchten, die nicht Version spezifisch sind, würde Ich mag sie zu den hinzufügen Namespace db
, aber das Problem ist, dass ich namespace db
nicht verwenden kann, weil es ein Alias ist.
db_global.h
namespace db <-- should be using the namespace for the current version
{
typedef enum
{
OK
} value;
}
Offensichtlich bekomme ich einen hier Fehler, da der Namespace db
bereits vorhanden ist, während das, was ich wirklich will ist, den Namensraum zu verlängern, ohne zu wissen, wich Version ist die aktuelle.
Soweit ich sehen kann, müsste ich eine solche Definition in einen separaten Namespace wie db_global
setzen oder ich müsste solche Symbole in allen Versionen duplizieren, was mir nicht wirklich gefällt.
Gibt es eine Möglichkeit, es so zu definieren, dass ich wie im Client-Code etwas schreiben kann:
x = db::value::OK;
Ich glaube nicht, das ist ein guter Ansatz ... Namespaces werden verwendet, um Namenskollision zu vermeiden , aber was Sie wahrscheinlich brauchen, ist, mit Vererbung und Polymorphismus zu arbeiten und denselben Namespace beizubehalten ... Was ist das Problem mit einer Basisklasse, die alle Basisfunktionen aufbaut und abgeleitete Klassen definiert, um genau das Verhalten zu definieren? – Jauch