如何 std::map<enum class, std::string>?

How to std::map<enum class, std::string>?

本文关键字:std string gt enum lt 如何 map class      更新时间:2023-10-16

我正在尝试使用枚举类和std :: string进行std :: map,但是我遇到了一些错误。我正在使用-STD = C 0x(这是固定)

的GCC 4.4.7

at .h文件:

enum class state_t{
    unknown,
    off,
    on,
    fault
};
typedef std::map<state_t,std::string> statemap_t;

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

混合时,我会得到下一个错误:错误:类型为" state_t"answers" state_t"的操作数无效到二进制'operator&lt;'

如果我将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.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中,这些功能很可能是通过模板专业化实现的,使用std :: undlying_type用于static_cast和资格符,并将它们专门用于枚举类,其中一些可能在-std = C 0x下不可用对于您的特定编译器版本