列挙型と名前空間の関係について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ぬっち

列挙型と名前空間の関係について

#1

投稿記事 by ぬっち » 15年前

ご無沙汰しています。
列挙型と名前空間について上手くいかなかったことがあって、いろいろ調べても目的としたものが出てこなかったのでここで質問させていただきます。
C++ですのでこの掲示板での質問が禁止でしたら指摘してくだされば、削除します。
言語はC++で、DirectXの自作ライブラリを行っているところです。

まず、ある名前空間(MyDirectXLib)があったとして、ここでDirectXの機能を実装しています。
そしてそのMyDirectXLibの中で、キーボードのキーを表す列挙型(KeyBoardKey)があったとします。
このKeyBoardKeyを、MyDirectXLibで実装したものを使いやすくした関数が集まっている公開用の名前空間(MyDirectXLibPublic)で、使えるようにするのにはどのようにしたらよいでしょうか?
つまり、KeyBoardKeyをMyDirectXLibで定義して、MyDirectXLibPublicで使いたいのです。
当然ながらtypedefはだめでした。
こうなると両方の名前空間に同じ列挙型を指定しなくてはならないのでしょうか?
一応下に単純なソースを載せておきます。

なお、このような面倒な方法をするのは、MyDirectXLibを公開したくないからです。
使用する人がMyDirectXLibPublicのみ使うようにしたいからです。
//------------------------
// KeyBoard.h
//------------------------

#ifndef INCLUDED_KEYBOARD_H
#define INCLUDED_KEYBOARD_H
//DirectXの機能を実装する名前空間
namespace MyDirectXLib
{
    //キーボードのキーを表す列挙型
    enum KeyBoardKey
    {
        KEYBOARD_KEY_ESC        = 0x01;
        KEYBOARD_KEY_1            = 0x02;
        ...
        ...
        KEYBOARD_KEY_MEDIASELECT    = 0xED;
    }
}
#endif

//------------------------
// Public.h
//------------------------

#ifndef INCLUDED_PUBLIC_H
#define INCLUDED_PUBLIC_H
//MyDirectXLibで実装した機能を簡単にした公開用関数をまとめた名前空間
namespace MyDirectXLibPublic
{
    //この名前空間内でKeyBoard.hで定義した列挙型KeyBoardKeyを使いたい
    // 以下エラーだったもの
    // typedef MyDirectXLib::KeyBoardKey KeyBoardKey ←これだけだと列挙子が必要だという
    // typedef MyDirectXLib::KEYBOARD_KEY_ESC KEYBOARD_KEY_ESC ←このようなことを全ての列挙子について行うと再定義だといわれる。
}
#endif
よろしくお願いします。

hoge

Re:列挙型と名前空間の関係について

#2

投稿記事 by hoge » 15年前

using宣言するか、列挙型専用のnamespaceを作ってusing ディレクティブするかどちらかでしょうね。
//using 宣言
namespace MyDirectXLibPublic
{
    using MyDirectXLib::KEYBOARD_KEY_ESC; // これをすべての列挙子に行なう。
}
//using ディレクティブ
namespace MyDirectXLib
{

namespace MyDirectXLib_enum
{
    enum KeyBoardKey
    {
        KEYBOARD_KEY_ESC        = 0x01;
        KEYBOARD_KEY_1            = 0x02;
        ...
        ...
        KEYBOARD_KEY_MEDIASELECT    = 0xED;
    };
}
using namespace MyDirectXLib_enum;

}

namespace MyDirectXLibPublic
{
    using namespace MyDirectXLib::MyDirectXLib_enum;
}

たかぎ

Re:列挙型と名前空間の関係について

#3

投稿記事 by たかぎ » 15年前

公開するものはMyDirectXLibPublic内で定義して、MyDirectXLib内で、

using namespace MyDirectXLibPublic;

とするか、using指令を使わずにフルネームで使えばよいのではないでしょうか?

ぬっち

Re:列挙型と名前空間の関係について

#4

投稿記事 by ぬっち » 15年前

hogeさん、たかぎさん(返答のプレビューを見ているときに投稿されたようで^^;)返答ありがとうございます。

なるほど、このような方法がありましたか・・・。
C++がまだ完璧に使いこなせていないためかこの方法を思いつきませんでした^^;
おかげさまで解決しました^^
ちなみに列挙型専用のnamespaceを作る方法やたかぎさんの方法ですと、私の設計が悪かったためか、修正が困難な状況になってしまいましたので、それぞれの列挙子についてusing宣言をしたところ望んだ結果が得られました。
それにしてもやはりC++は設計を含め奥深いですね^^;

今後もわからないことがあったら質問させていただきます。
ありがとうございましたm(--)m

閉鎖

“C言語何でも質問掲示板” へ戻る