C++ const-ness,Boost 无序映射,operator[]

标签 c++ boost constants

我希望这个问题在没有看到代码的情况下是可以回答的,因为我很不清楚问题出在哪里。我在 Boost 无序映射上使用 operator[] 来查找键并返回它映射到的 vector 。这是在赋值语句的 RHS 上,但我得到的错误似乎暗示 operator[] 不保证常量。我刚刚开始尝试学习 const - 正确性。有人可以解码这个错误并指导我找出问题所在吗?或者询问更多详情?

编译器是 Apple LLVM version 4.2 (clang-425.0.28)

Block.cpp:89:39: error: no viable overloaded operator[] for type 'const Record_map' (aka 'const unordered_map<Typecode, FV_pair_vec>')
    FV_pair_vec const fv_vec = records[rec_type];
                               ~~~~~~~^~~~~~~~~
/usr/local/include/boost/unordered/unordered_map.hpp:420:22: note: candidate function not viable: 'this' argument has type 'const Record_map'
      (aka 'const unordered_map<Typecode, FV_pair_vec>'), but method is not marked const
        mapped_type& operator[](const key_type&);
                     ^

最佳答案

问题在于所讨论的运算符不是const,也就是说,它不能在const 对象上调用,也不能通过const引用。确实提供 const 版本的替代方案是 at(key_type const&),如果具有该键元素的元素不在映射中,它将引发异常。所以你可以使用

mapped_type x = theMap.at(theKey);

代替

mapped_type x = theMap[theKey];

否则,使用 unordered_map::find(key_type const&) 方法。

关于C++ const-ness,Boost 无序映射,operator[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17505367/

相关文章:

c - 我无法确定为什么这个 C 程序会给我这个答案

c++ - 将 STL 容器与迭代器一起使用的常见误用是什么?

c++ - 二进制流或类似的东西将 std::vector 之类的类保存到文件中?

c# - 创建 C++ DLL,然后在 C# 中使用它

c++ - 无法使用模板参数编译 boost 元状态机

c - C 中的换行常量

C++ 模板默认构造函数

c++ - 静态模板类的奇怪行为

c++ - 是否可以将成员初始化推迟到构造函数主体?

C++ 查找方法不是 const 吗?