这个标题有很多问题,但似乎它们都与我的情况不相似。
我有一个班级成员
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个错误
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)
C++ Error: “expression must have integral or unscoped enum type”
经过一段时间的调试后,我发现我在修改const成员函数中的成员变量时做了愚蠢的事情。
所以我的问题是。是否与我收到的错误消息有任何关联并且我做错了?为什么编译器在这种情况下会出现此错误?
我正在Visual Studio 2013上编译我的代码
答案 0 :(得分:4)
第一个错误的原因很明显:在const
限定的成员函数内,对象的所有非mutable
数据成员都通过const
限定的访问路径访问。因此,您的地图实际上是const
,并且您尝试在其上调用非const
函数。
至于第一个错误的确切措辞:记住std::map::operator[]
几乎与其他任何函数一样。您使用const std::map
和std::string
类型的参数调用它。编译器说它无法找到任何可以接受它们的重载。当然,原因是唯一存在的重载需要非const
map
。
您可以简单地忽略您获得的第二个错误。编译器对第一个错误感到有些困惑,并打印出虚假的第二个错误。
可能发生的事情是编译器说“你不能在这里使用map
的{{1}},它是非operator []
而你的地图是const
。”然后,由于它没有找到const
的运算符重载,它将其解释为内置运算符[]
,其中至少有一个操作数必须具有整数或未整数的枚举类型。因此第二个错误。