C++错误:在使用运算符[]将元素插入std::map时,“表达式必须具有整型或非范围枚举类型”



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

我有一个班级成员

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

我有两个错误

  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”

经过一段时间的调试,我发现我做了一件愚蠢的事情,试图修改const成员函数中的成员变量。

所以我的问题是,我收到的错误信息和我犯的错误有什么联系吗?为什么编译器在这种情况下会出现这个错误?

我正在Visual Studio 2013 上编译代码

第一个错误的原因很清楚:在const限定的成员函数中,对象的所有非mutable数据成员都是通过const限定的访问路径访问的。所以你的地图实际上是const,你正试图在上面调用一个非const函数

至于第一个错误的确切措辞:请记住,std::map::operator[]与其他函数非常相似。您使用类型为const std::mapstd::string的参数来调用它。编译器表示找不到任何可以接受它们的重载。当然,原因是唯一存在的过载需要一个非constmap

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

可能会发生的情况是,编译器说"您不能在这里使用mapoperator [],它是非const,您的映射是const。"然后,由于它没有找到[]的运算符重载,它将其解释为内置运算符[],对于该运算符,至少有一个操作数必须具有整型或非量程枚举类型。因此出现了第二个错误。

相关内容

  • 没有找到相关文章

最新更新