首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C++错误:当将元素插入std::operator[]时,“表达式必须具有整数或未限定范围的枚举类型”

C++错误:当将元素插入std::operator[]时,“表达式必须具有整数或未限定范围的枚举类型”
EN

Stack Overflow用户
提问于 2015-10-28 07:39:25
回答 1查看 1.2K关注 0票数 1

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

我有一位班级成员

代码语言:javascript
运行
复制
std::map<std::string, Mode> m_stringToMode;

Mode

代码语言:javascript
运行
复制
enum class Mode
{
    Default, Express
};

还有一个const方法,在这个方法中,我用operator[]将一个新元素插入到映射中

代码语言:javascript
运行
复制
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 2013上的代码

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-28 07:58:37

第一个错误的原因很清楚:在const-qualified成员函数中,对象的所有非mutable数据成员都通过const-qualified访问路径进行访问。因此,您的映射实际上是const,您试图在其上调用一个非const函数。

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

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

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33385402

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档