这个标题有很多问题,但似乎它们都与我的情况不同。
我有一位班级成员
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 2013上的代码
发布于 2015-10-28 07:58:37
第一个错误的原因很清楚:在const-qualified成员函数中,对象的所有非mutable数据成员都通过const-qualified访问路径进行访问。因此,您的映射实际上是const,您试图在其上调用一个非const函数。
至于第一个错误的确切措辞:请记住,std::map::operator[]与任何其他函数差不多都是一个函数。您使用const std::map和std::string类型的参数调用它。编译器说它找不到任何可以接受它们的重载。当然,原因是现有的唯一重载需要一个非const map。
您得到的第二个错误可以简单地忽略。编译器对第一个错误有点困惑,并打印虚假的第二个错误。
可能发生的情况是编译器说“您不能在这里使用map的operator [],它是非const的,而您的映射是const。”然后,由于它没有找到[]的操作符重载,所以它将它解释为内置操作符[],对于该操作数,至少必须有一个整数或非作用域枚举类型。因此,第二个错误。
https://stackoverflow.com/questions/33385402
复制相似问题