0

アプリケーションに静的なunordered_mapsがいくつかあり、起動時に初期化できるようにしたいと考えています。それらはクラスの一部ではありません。私の初期設定では、ヘッダーとソースファイルは次のとおりでした。

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)
    ;

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

前もって感謝します

4

1 に答える 1

2

定義を正しい名前空間に配置する必要があります。それ以外の場合は、:のマップではなく、グローバル名前空間で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。)

于 2011-07-23T01:27:07.617 に答える