如何 std::map<enum class, std::string>?
How to std::map<enum class, std::string>?
我正在尝试使用枚举类和std :: string进行std :: map,但是我遇到了一些错误。我正在使用-STD = C 0x(这是固定)
的GCC 4.4.7at .h文件:
enum class state_t{
unknown,
off,
on,
fault
};
typedef std::map<state_t,std::string> statemap_t;
at .cpp文件:
statemap_t state={
{state_t::unknown,"unknown"}
{state_t::off,"off"}
{state_t::on,"on"}
{state_t::fault,"fault"}
}
允许状态过渡的方法:
Foo::allowStateChange(const state_t localState, const state_t globalState, const state_t newState){
//Some code to verify if the state transition is allowed.
std::cout << "Device Local State:" << state.find(localState)->second << "Device Global State:" << state.find(globalState)->second << "Device New State:" << state.find(newState)->second << std::endl;
}
混合时,我会得到下一个错误:错误:类型为" state_t"answers" state_t"的操作数无效到二进制'operator&lt;'
如果我将enum class state_t
更改为enum state_t
,则有效。有什么方法可以在地图中找到枚举类别?
预先感谢。
以下代码正常工作(在Visual Studio 2015(V140)上;在您的情况下使用哪个编译器?):
#include <string>
#include <iostream>
#include <map>
using namespace std;
enum class state_t {
unknown,
off,
on,
fault
};
typedef std::map<state_t, std::string> statemap_t;
statemap_t state = {
{ state_t::unknown,"unknown" },
{ state_t::off,"off"},
{ state_t::on,"on"},
{ state_t::fault,"fault"}
};
void allowStateChange(const state_t localState, const state_t globalState, const state_t newState) {
//Some code to verify if the state transition is allowed.
std::cout
<< "Device Local State:"
<< state.find(localState)->second
<< ", Device Global State:"
<< state.find(globalState)->second
<< ", Device New State:"
<< state.find(newState)->second
<< std::endl;
}
int main()
{
allowStateChange(state_t::on, state_t::off, state_t::fault);
return 0;
}
bwt,在state_t.t。
我假设您使用的GCC编译器版本并不支持与枚举类关联的所有基础结构。因此,您需要自己实施缺失的操作员,如下所示:
inline bool operator <(const state_t left, const state_t right)
{
return static_cast<int>(left) < static_cast<int>(right);
}
inline bool operator >(const state_t left, const state_t right)
{
return static_cast<int>(left) > static_cast<int>(right);
}
在C 11中,这些功能很可能是通过模板专业化实现的,使用std :: undlying_type用于static_cast和资格符,并将它们专门用于枚举类,其中一些可能在-std = C 0x下不可用对于您的特定编译器版本
相关文章:
- cppcheck在const std::string[]上引发警告
- 将std::string传递给WriteConsole API
- 为std::string的某个索引赋值
- 使用 std::string () const 函数启动线程或未来
- 当我们进行一些操作时,应该使用什么'std::string'或'std::stringstream'?
- 如何更改大小(std::string)
- std::string 的对象真的可以移动吗?
- SegFault 同时使用 std::string::operator+= 和函数作为参数
- 无法从 std::string 中提取C++ Unicode 符号
- std::string 构造函数如何处理固定大小的 char[]?
- 真的没有来自 std::string_view 的 std::string 的显式构造函数吗?
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 重载 + 自己的类和 std::string 的运算符
- 如何使用 std::string 作为 QHash 的键?
- 将日语 wstring 转换为 std::string
- 可以从std::string继承以提供类型一致性吗
- 构造函数采用std::string_view与std::string并移动
- 在共享缓冲区内存中创建 ::std::string 对象
- std::string.size() 未知行为
- Valgrind 在 std::string::swap 中报告 SIGILL