2011-07-23 20 views
0

起動時に初期化できるようにするために、私のアプリケーションに静的なunordered_mapsがいくつかあります。彼らはクラスの一部ではありません。次のように私の初期設定では、ヘッダーとソースファイルは以下の通りであった。静的なboost :: unordered_mapの初期化

namespace Game 
{ 
    namespace Elements 
    { 

     enum Element 
     { 
      Air = 1, 
      Dark = 2, 
      Earth = 4, 
      Elementless = 8, 
      Fire = 16, 
      Ice = 32, 
      Light = 64, 
      SpaceTime = 128, 
      Thunder = 256, 
      Water = 512, 
     }; 
     static boost::unordered_map<Element, std::string> ElementNameMap; 
     static boost::unordered_map<std::string, Element> NameElementMap 
     } 
} 

とソースファイル:私はこれをやってみましたび

#include "Elements.h" 

using namespace std; 
using namespace Game::Elements; 

boost::unordered_map<Element, std::string> ElementNameMap = boost::assign::map_list_of 
    (Element::Air, string("Air")) 
    (Element::Dark, string("Dark")) 
    (Element::Earth, string("Earth")) 
    (Element::Elementless, string("Elementless")) 
    (Element::Fire, string("Fire")) 
    (Element::Ice, string("Ice")) 
    (Element::Light, string("Light")) 
    (Element::SpaceTime, string("SpaceTime")) 
    (Element::Thunder, string("Thunder")) 
    (Element::Water, string("Water")) 
    ; 

boost::unordered_map<std::string, Element> NameElementMap = boost::assign::map_list_of 
    (string("Air"), Element::Air) 
    (string("Dark"), Element::Dark) 
    (string("Earth"), Element::Earth) 
    (string("Elementless"), Element::Elementless) 
    (string("Fire"), Element::Fire) 
    (string("Ice"), Element::Ice) 
    (string("Light"), Element::Light) 
    (string("SpaceTime"), Element::SpaceTime) 
    (string("Thunder"), Element::Thunder) 
    (string("Water"), Element::Water) 
    ; 

はしかし、その後、(地図上で検索を実行しようとしましたつまり、Game :: Elements :: NameElementMap [std :: string( "Air")])は常に空文字列を返し、その使用コンテキストのサイズは0です。

初期化をヘッダーファイルに移動しようとしました(つまり、ヘッダファイルには

static boost::unordered_map<Element, std::string> ElementNameMap = boost::assign::map_list_of 
    (Element::Air, string("Air")) 
    (Element::Dark, string("Dark")) 
    (Element::Earth, string("Earth")) 
    (Element::Elementless, string("Elementless")) 
    (Element::Fire, string("Fire")) 
    (Element::Ice, string("Ice")) 
    (Element::Light, string("Light")) 
    (Element::SpaceTime, string("SpaceTime")) 
    (Element::Thunder, string("Thunder")) 
    (Element::Water, string("Water")) 
    ; 
static boost::unordered_map<std::string, Element> NameElementMap = boost::assign::map_list_of 
    (string("Air"), Element::Air) 
    (string("Dark"), Element::Dark) 
    (string("Earth"), Element::Earth) 
    (string("Elementless"), Element::Elementless) 
    (string("Fire"), Element::Fire) 
    (string("Ice"), Element::Ice) 
    (string("Light"), Element::Light) 
    (string("SpaceTime"), Element::SpaceTime) 
    (string("Thunder"), Element::Thunder) 
    (string("Water"), Element::Water) 
    ; 

しかし、コンパイラはデフォルトのコンストラクタがないことに不満を抱いていました。私は間違って何をしていますか?

ありがとうございました

+0

ブースト:: bimap、あなたがここでやっていることのために作られたもの。 http://www.boost.org/doc/libs/1_50_0/libs/bimap/doc/html/index.html – paxos1977

答えて

2

正しい名前空間に定義を挿入する必要があります。そうしないと、代わりにGame::Elements中のもので、グローバル名前空間に二つの新しいマップを定義している:

namespace Game { 
namespace Elements { 

boost::unordered_map<Element, std::string> ElementNameMap = boost::assign::map_list_of 
    (Air, string("Air")) 
    (Dark, string("Dark")) 
... 

} 
} 

(また、列挙型は、新しい名前空間を作成していないので、それだけでAir、ないElement::Airです。)

+0

新しいenumクラスのC++ 0xを使用する場合は、enum要素を修飾する必要があります"Element :: Air"のような列挙型の名前で – David