簡體   English   中英

如何std ::地圖 <enum class, std::string> ?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM