Инициализация статического повышения :: unordered_map - PullRequest
0 голосов
/ 23 июля 2011

В моем приложении есть несколько статических 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)
    ;

но компилятор пожаловался на отсутствие конструктора по умолчанию. Что я делаю не так?

заранее спасибо

1 Ответ

2 голосов
/ 23 июля 2011

Вы должны поместить определения в правильное пространство имен.В противном случае вы определяете две новые карты в глобальном пространстве имен вместо тех, которые указаны в 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.)

...