[英]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.