填充静态std :: map类成员变量时出现冲突的声明

时间:2010-05-28 20:30:07

标签: c++ map static-members

我有一个带有静态std :: map成员变量的类,它将char映射到自定义类型Terrain。我试图在类的实现文件中填充这个映射,但是我得到了几个错误。这是我的头文件:

#ifndef LEVEL_HPP
#define LEVEL_HPP

#include <bitset>
#include <list>
#include <map>
#include <string>
#include <vector>
#include "libtcod.hpp"

namespace yarl
{
    namespace level
    {
        class Terrain
        {
        // Member Variables
            private:
               std::bitset<5> flags;

        // Member Functions
            public:
                explicit Terrain(const std::string& flg)
                : flags(flg) {}

            (...)
        };



        class Level
        {
            private:
                static std::map<char, Terrain> terrainTypes;

            (...)
        };
    }
}

#endif 

这是我的实施文件:

#include <bitset>
#include <list>
#include <map>
#include <string>
#include <vector>
#include "Level.hpp"
#include "libtcod.hpp"
using namespace std;

namespace yarl
{
    namespace level
    {
        /* fill Level::terrainTypes */
        map<char,Terrain> Level::terrainTypes['.'] = Terrain("00001");  // clear
        map<char,Terrain> Level::terrainTypes[','] = Terrain("00001");  // clear 
        map<char,Terrain> Level::terrainTypes['\''] = Terrain("00001"); // clear
        map<char,Terrain> Level::terrainTypes['`'] = Terrain("00001");  // clear
        map<char,Terrain> Level::terrainTypes[178] = Terrain("11111");  // wall

        (...)
    }
}

我正在使用g ++,我得到的错误是

src / Level.cpp:15:错误:冲突声明'std :: map,std :: allocator&gt; &GT; yarl :: level :: Level :: terrainTypes [46]'
src / Level.hpp:104:错误:'yarl :: level :: Level :: terrainTypes'的前一个声明为'std :: map,std :: allocator&gt; &GT; yarl ::级别::程度:: terrainTypes’
src / Level.cpp:15:错误:'std :: map,std :: allocator&gt;的声明&GT; yarl :: level :: Level :: terrainTypes'在类之外不是定义
src / Level.cpp:15:错误:从'yarl :: level :: Terrain'转换为非标量类型'std :: map,std :: allocator&gt; &gt;'要求
src / Level.cpp:15:错误:'yarl :: level :: Level :: terrainTypes'在声明时不能通过非常量表达式初始化

我为实现文件中的每个地图分配行获取了一组这些。有谁看到我做错了什么?谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

您可以在函数之外初始化静态成员,但不能执行任意操作。

您可以使用函数初始化成员:

namespace {
    std::map<char, Terrain> initTerrainTypes() {
        std::map<char, Terrain> m;
        m['.'] = Terrain("00001"); 
        // ...
        return m;
    }
}

map<char,Terrain> Level::terrainTypes = initTerrainTypes();

或者您可以使用Boost.Assign等初始化实用程序:

map<char,Terrain> Level::terrainTypes = boost::assign::map_list_of
   ('.', Terrain("00001"))
   // ...
   (178, Terrain("11111"));