我可以使用std :: map,其中键和值都是C ++ 11中的枚举类吗?

时间:2014-07-04 23:38:17

标签: c++ c++11 stl enums

我需要一种将C ++ 11 enum classes映射到其他enum classes的方法。让我们说我有这些C ++ 11风格的枚举:

#include <iostream>
#include <map>

class Foobar
{
public:

    enum class Lecture
    {
        COMP_SCI,
        PHYSICS,
        CHEMISTRY,
        BIOLOGY,
        PSYCHOLOGY,
        MODERN_ART,
        PHILOSOPHY,
        SOCIOLOGY
    };

    enum class Day
    {
        MONDAY,
        TUESDAY,
        WEDNESDAY,
        THURSDAY,
        FRIDAY,
        SATURDAY,
        SUNDAY
    };
};


void test_enum_class_to_enum_class_std_map()
{
    std::map<Foobar::Lecture, Foobar::Day> lectureToDayMap;

    lectureToDayMap.insert(Foobar::Lecture::COMP_SCI, Foobar::Day::MONDAY);

}

int main(int argc, char** argv)
{
    test_enum_class_to_enum_class_std_map();

    return 0;
}

有没有办法从一个枚举类映射到另一个枚举类?

我想要像

这样的东西

std::map<Foobar::Lecture, Foobar::Day> lectureToDayMap;

如果这不可能,我是否可以从int转换为enum class,反之亦然,这样我就可以使用std::map<int, int>地图并转换为{ {1}}要插入,然后返回int以检索值?

这是编译错误当我尝试第一种方法时:

enum class

感谢您的时间:)

编辑1:修复了缺少的逗号

编辑2:添加了我收到的编译错误

编辑3:添加了我正在尝试的内容的完整来源

编辑4:没有新代码或任何内容,只是向所有人道歉,误解了这些帖子的工作原理。我仍然很难理解编译错误,而且我没有找到我在谷歌中寻找的确切内容。我认为直接询问我想要的内容可能更容易,也许可以解释一下类枚举如何与地图一起工作(或者不是)。我将继续使用我的测试源并继续关注Google。很抱歉让你们大吃一惊:(

编辑5: 你们很友好地告诉我我的错误在哪里,谢谢。我没有看到test_cpp11_enums.cpp: In function ‘void test_enum_class_to_enum_class_std_map()’: test_cpp11_enums.cpp:51:74: error: no matching function for call to ‘std::map<Foobar::Lecture, Foobar::Day>::insert(Foobar::Lecture, Foobar::Day)’ lectureToDayMap.insert(Foobar::Lecture::COMP_SCI, Foobar::Day::MONDAY); ^ test_cpp11_enums.cpp:51:74: note: candidates are: In file included from /usr/include/c++/4.8/map:61:0, from test_cpp11_enums.cpp:9: /usr/include/c++/4.8/bits/stl_map.h:594:7: note: std::pair<typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator, bool> std::map<_Key, _Tp, _Compare, _Alloc>::insert(const value_type&) [with _Key = Foobar::Lecture; _Tp = Foobar::Day; _Compare = std::less<Foobar::Lecture>; _Alloc = std::allocator<std::pair<const Foobar::Lecture, Foobar::Day> >; typename std::_Rb_tree<_Key, std::pair<const _Key, _Tp>, std::_Select1st<std::pair<const _Key, _Tp> >, _Compare, typename _Alloc::rebind<std::pair<const _Key, _Tp> >::other>::iterator = std::_Rb_tree_iterator<std::pair<const Foobar::Lecture, Foobar::Day> >; std::map<_Key, _Tp, _Compare, _Alloc>::value_type = std::pair<const Foobar::Lecture, Foobar::Day>] insert(const value_type& __x) sdt::map函数没有将键和值作为参数。起初我认为错误意味着没有insert命名插入存在,当我检查它在线时,我不知何故错过了查看参数,确信这与std::map有关,因为我以前从没用过它们。

1 个答案:

答案 0 :(得分:5)

根据http://en.cppreference.com/w/cpp/container/map std :: map是一个有序关联容器,包含具有唯一键的键值对。因此,您必须插入一对。

替换

 lectureToDayMap.insert(Foobar::Lecture::COMP_SCI, Foobar::Day::MONDAY);

通过

mymap.insert(std::make_pair(Foobar::Lecture::COMP_SCI, Foobar::Day::MONDAY));

或更好

lectureToDayMap[Foobar::Lecture::COMP_SCI] = Foobar::Day::MONDAY;