gpt4 book ai didi

c++ - 填充静态 std::map 类成员变量时的声明冲突

转载 作者:行者123 更新时间:2023-11-28 08:29:08 28 4
gpt4 key购买 nike

我有一个带有静态 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: error: '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: error: ‘yarl::level::Level::terrainTypes’ 在声明时不能被非常量表达式初始化

我为实现文件中的每个 map 分配行获得了一组这些。有人看到我做错了什么吗?感谢您的帮助。

最佳答案

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

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

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

关于c++ - 填充静态 std::map 类成员变量时的声明冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932300/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com