[英]conflicting declaration when filling a static std::map class member variable
我有一个带有静态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>> yarl :: level :: Level :: terrainTypes [46]'冲突
src / Level.hpp:104:错误:'yarl :: level :: Level :: terrainTypes'先前已声明为'std :: map,std :: allocator>> yarl :: level :: Level :: terrainTypes'
src / Level.cpp:15:错误:类外的'std :: map,std :: allocator>> yarl :: level :: Level :: terrainTypes的声明未定义
src / Level.cpp:15:错误:请求从'yarl :: level :: Terrain'转换为非标量类型'std :: map,std :: allocator>>'
src / Level.cpp:15:错误:声明时,'yarl :: level :: Level :: terrainTypes'不能由非恒定表达式初始化
对于实现文件中的每个地图分配行,我都会得到一组。 有人看到我在做什么错吗? 谢谢你的帮助。
您可以在函数外部初始化静态成员,但不能执行任意操作。
您可以使用函数来初始化成员:
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"));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.