[英]How to std::map<enum class, std::string>?
我正在尝试使用枚举类和std :: string进行std :: map,但是出现了一些错误。 我正在将gcc 4.4.7与-std = c ++ 0x一起使用(这是固定的)
在.h文件中:
enum class state_t{
unknown,
off,
on,
fault
};
typedef std::map<state_t,std::string> statemap_t;
在.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;
}
编译时,出现下一个错误:错误:二进制“ operator <”类型为“ state_t”和“ state_t”的无效操作数
如果我将enum class state_t
更改为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中存在拼写错误“ unkmown”。
我假设您使用的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中,这些功能可能是通过模板专门化来实现的,对static_cast使用std :: underlying_type并将限定词专门与枚举类绑定,对于您特定的类,其中一些可能在-std = c ++ 0x下不可用编译器版本
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.