私はネームスペースを使用して、異なるバージョンのデータベース実装を切り替えています。私のクライアントコードは詳細を知る必要はないので、名前空間エイリアスを使用して特定のバージョンをクライアントコードから隠す必要があります。 エイリアスネームスペースにアイテムを追加する
#ifdef _DB_V1
#include "db_v1.h"
#endif
namespace db = db_v1;
db_def.h
db_v1.h
namespace db_v1
{
class Database ...
}
私はバージョン固有のものではありません追加項目、で名前空間を拡張したい場合は今、私はそれらを追加したいと思います名前空間db
ですが、問題は、別名であるためnamespace db
を使用できないことです。
db_global.h明らか
namespace db <-- should be using the namespace for the current version
{
typedef enum
{
OK
} value;
}
名前空間db
がすでに存在しているので、私が本当にしたいことはウィッヒバージョンを知らなくても、名前空間を拡張するために、あるとき私は、ここでエラーを取得するには、現在のものです。
私が見る限り、このような定義をdb_global
のような別の名前空間に入れる必要があります。そうしないと、すべてのバージョンでそのようなシンボルを複製する必要があります。 db_def.h
代わりのnamespace db = db_v1;
で
x = db::value::OK;
私は、これは良い方法だとは思わない...名前空間は、名前の衝突を回避するために使用されていますしかし、おそらくあなたが必要とするのは、継承と多態性を使って同じ名前空間を維持することです。基本クラスにすべての基本機能を設定し、派生クラスに厳密な振る舞いを定義させる問題は何ですか? – Jauch