C ++错误:当使用operator []将元素插入std :: map时,“表达式必须具有整数或未整合的枚举类型”

时间:2015-10-28 07:39:26

标签: c++ visual-studio-2013

这个标题有很多问题,但似乎它们都与我的情况不相似。

我有一个班级成员

std::map<std::string, Mode> m_stringToMode;

Mode

enum class Mode
{
    Default, Express
};

我有一个const方法,我在operator[]

的地图中插入了一个新元素
void LevelParser::myFunc() const
{
    std::string myStr = "myStr";
    m_stringToMode[myStr] = Mode::Express;
}

我得到了2个错误

  1. C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<std::string,Mode,std::less<_Kty>,std::allocator<std::pair<const _Kty,_Ty>>>' (or there is no acceptable conversion)
  2. C++ Error: “expression must have integral or unscoped enum type”
  3. 经过一段时间的调试后,我发现我在修改const成员函数中的成员变量时做了愚蠢的事情。

    所以我的问题是。是否与我收到的错误消息有任何关联并且我做错了?为什么编译器在这种情况下会出现此错误?

    我正在Visual Studio 2013上编译我的代码

1 个答案:

答案 0 :(得分:4)

第一个错误的原因很明显:在const限定的成员函数内,对象的所有非mutable数据成员都通过const限定的访问路径访问。因此,您的地图实际上是const,并且您尝试在其上调用非const函数。

至于第一个错误的确切措辞:记住std::map::operator[]几乎与其他任何函数一样。您使用const std::mapstd::string类型的参数调用它。编译器说它无法找到任何可以接受它们的重载。当然,原因是唯一存在的重载需要非const map

您可以简单地忽略您获得的第二个错误。编译器对第一个错误感到有些困惑,并打印出虚假的第二个错误。

可能发生的事情是编译器说“你不能在这里使用map的{​​{1}},它是非operator []而你的地图是const。”然后,由于它没有找到const的运算符重载,它将其解释为内置运算符[],其中至少有一个操作数必须具有整数或未整数的枚举类型。因此第二个错误。