c++ - 在类成员的实例化期间: "no operator "[ ]"matches these operands"使用 map[key] 访问 std::map 值时

标签 c++ compiler-errors std stdmap in-class-initialization

我已经看了很长时间了。我不明白是什么在困扰它。给我问题的最小代码如下所示。我评论发生错误的行。编译错误跟在代码后面。

#include <map>
#include <cstdlib>
#include <cstdint>

template<std::size_t D>
class myclassA{
private:  
  std::array<std::string, D> a;
  std::map<std::string, std::size_t> a_type_num;
  std::array<std::size_t, D> a_dims;

  // used to initialize a_type_num
  inline std::map<std::string, std::size_t> return_type_dims() const{
    std::map<std::string, std::size_t> temp;
    for(auto const &s: a)
      temp.emplace(s, 0);
    for(auto const &s: a)     
      temp[s]++;
    return temp;
  };

  // used to initialize a_dims
  inline std::array<std::size_t, D> return_site_dims() const{
    std::array<std::size_t, D> temp;
    for(int i=0; i<D; i++)
      temp[i] = a_type_num[a[i]];  // ERROR!!!
    return temp;
  };

public:  
  // constructor
  myclassA(const std::array<std::string,D> &user) :  a(user)
    , a_type_num(return_type_dims())
    , a_dims(return_site_dims())
  {};
};

int main(int argc, char *argv[]){
  myclassA<4> co({"d","d","p","p"});
  return 0;
}

编译时出现错误:
src/main.cpp(32): error: no operator "[]" matches these operands
            operand types are: const std::map<std::__cxx11::string, std::size_t, std::less<std::__cxx11::string>, std::allocator<std::pair<const std::__cxx11::string, std::size_t>>> [ const std::__cxx11::string ]
        temp[i] = a_type_num[a[i]];  
                            ^
          detected during:
            instantiation of "std::array<std::size_t={unsigned long}, D> myclassA<D>::return_site_dims() const [with D=4UL]" at line 40
            instantiation of "myclassA<D>::myclassA(const std::array<std::__cxx11::string, D> &) [with D=4UL]" at line 45

另一方面,像这样的东西编译得很好(我的意思是代码什么都不做,但它编译):
#include <map>
#include <cstdlib>
#include <cstdint>

int main(int argc, char *argv[]){
  // myclassA<4> co({"d","d","p","p"});

  std::array<std::string, 10> a;
  std::map<std::string, std::size_t> a_type_num;
  std::array<std::size_t, 10> temp;
  for(int i=0; i<10; i++)
    temp[i] = a_type_num[a[i]];  

return 0;


所以我的问题是:为什么提示 no operator "[]" matches these operands ?

最佳答案

[]运算符需要 std::map那不是 const ,因为它在找不到key时的行为是通过插入key来修改map。在您的代码中,您有 return_site_dims方法是 const方法,意味着它只有 const访问 myClassA 的所有非静态成员类,包括 a_type_num map 。因此,此方法无法使用 []该 map 上的运算符(operator)。要解决此问题,您可以制作 return_site_dims一个非const方法。

关于c++ - 在类成员的实例化期间: "no operator "[ ]"matches these operands"使用 map[key] 访问 std::map 值时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61070994/

相关文章:

c - 在Visual Studio Code上编译C文件代码时出现问题

android - Android Studio 3.0 Beta5编译错误

c++以不止一种方式访问​​相同的元素

c++ - "::"中的 "::tolower"是什么意思?

c++ - 在 C++ 循环中添加定时器

android - 用于 QualComm 的 Snapdragon 的 H264 硬件解码器 OpenMax IL

c++ - 是否可以让一个 vector 指向其他 vector 的子集?

python - 如何返回一个串联的元组?

c++ - std::set 迭代器自动 const

c++ - 从QTreeWidget中removeItemWidget后是否需要删除小部件?