2017-02-24 102 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