2017-02-24 177 views
-1

我想std :: map,一個枚舉類和一個std :: string,但我得到一些錯誤。 我使用gcc 4.4.7與-std =的C++ 0x(這是固定的)如何使用std :: map <enum class,std :: string>?

在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"} 
} 

的法允許的狀態transitionis,如:

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; 
} 

compilling時,我得到一個錯誤: 錯誤:我類型「state_t」和「state_t」二進制「操作<」

的NVALID操作數如果我改變enum class state_tenum state_t它的工作原理。 有沒有什麼方法可以在地圖上找到一個枚舉類?

在此先感謝。

+1

你拼錯'<<'爲'<? –

+0

不,我檢查過它 – user2357667

+0

哦,所以這個問題與'cout'完全沒有關係?只是定義地圖工作? –

回答

2

下面的代碼工作得很好(在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」。

+0

在代碼中它是可以的,它是隻是拼寫錯誤,我沒有複製粘貼代碼 – user2357667

+0

我使用的是gcc 4.4.7(RedHat 4.4.7-4)。但我無法修改gcc版本 – user2357667

+0

gcc 4.4.7對於枚舉類的支持可能相當老。你可能不得不退出簡單的枚舉。 – stefaanv