这个标题有很多问题,但似乎都与我的情况不相似。
我有一个班级成员
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;
}
我有两个错误
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 上编译代码
第一个错误的原因很清楚:在const
限定的成员函数中,对象的所有非mutable
数据成员都是通过const
限定的访问路径访问的。所以你的地图实际上是const
,你正试图在上面调用一个非const
函数
至于第一个错误的确切措辞:请记住,std::map::operator[]
与其他函数非常相似。您使用类型为const std::map
和std::string
的参数来调用它。编译器表示找不到任何可以接受它们的重载。当然,原因是唯一存在的过载需要一个非const
map
。
您得到的第二个错误可以简单地忽略。编译器对第一个错误有些困惑,并打印出伪造的第二个错误。
可能会发生的情况是,编译器说"您不能在这里使用map
的operator []
,它是非const
,您的映射是const
。"然后,由于它没有找到[]
的运算符重载,它将其解释为内置运算符[]
,对于该运算符,至少有一个操作数必须具有整型或非量程枚举类型。因此出现了第二个错误。