0

我的应用程序中有一些静态 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)
    ;

但编译器随后抱怨没有默认构造函数。我究竟做错了什么?

提前致谢

4

1 回答 1

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 回答