无法在 const 成员函数

问题描述

我正在尝试在公共成员函数中迭代 multimap,它是我的类的私有成员,以便我可以遍历 multimap 并打印元素。我知道如果我将打印函数设置为非 const 它可以工作,但我无法完全理解为什么它不能与 const 一起工作。我假设分配迭代器 (my_map.begin()) 允许修改多重映射,但 const 修饰符不允许这样做,因此,代码将无法编译。谁能给我一个清晰和更深入的解释至于为什么这不适用于 const 函数?我对使用 STL 容器还很陌生,只是想更深入地了解它们的功能。感谢所有帮助。 (C++ 代码如下) (PS:为了尽可能清楚,我不是在问如何遍历多图。再次感谢。)

#include <iostream>
#include <iterator>
#include <string>
#include <map>

// Synonymous types for my  multimap and multimap iterator
typedef std::multimap<int,std::string> mm;
typedef mm::iterator mit;

class Foo
{
private:
  mm my_map;
  static int count;

public:
  Foo() {}
  void add(const std::string&);
  void print() const;
};

int Foo::count = 0;

void Foo::add(const std::string& s)
{
  my_map.insert(std::make_pair(count++,s));
}

**// This is the implementation of the that breaks my code**
void Foo::print() const
{
  mit it = my_map.begin(); // **I do not fully understand why this does not work.**
}

解决方法

如果您想在 const 函数中获取迭代器,则不能使用 iterator,而必须使用 const_iterator。所以你必须改变 mit 类型:

typedef mm::const_iterator mit;

这里正在编译和运行: https://godbolt.org/z/jM4rK6556

或者另一种方法是不强制类型并让它推断它想要的任何东西,通过改变打印内的行:

auto it = my_map.begin();

这是它的运行版本: https://godbolt.org/z/rTv6xqPqq

对于未来,最好将您遇到的错误包含在问题中,以便其他人知道并且更容易谷歌搜索。甚至阅读错误也暗示了正在发生的事情:

<source>: In member function 'const void Foo::print() const':
<source>:31:24: error: conversion from 'std::multimap<int,std::__cxx11::basic_string<char> >::const_iterator' {aka 'std::_Rb_tree<int,std::pair<const int,std::__cxx11::basic_string<char> >,std::_Select1st<std::pair<const int,std::__cxx11::basic_string<char> > >,std::less<int>,std::allocator<std::pair<const int,std::__cxx11::basic_string<char> > > >::const_iterator'} to non-scalar type 'mit' {aka 'std::_Rb_tree<int,std::__cxx11::basic_string<char> > > >::iterator'} requested
   31 |   mit it = my_map.begin();
      |            ~~~~~~~~~~~~^

所以说比较类型的时候不能从A型转换成B型,区别很明显,这里是A型:

std::multimap<int,std::__cxx11::basic_string<char> >::const_iterator

所以您的 mit 类型与 my_map.begin() 返回的内容不匹配。