【问题标题】:Cannot Assign multimap iterator private multimap member begin in const member function无法在 const 成员函数中分配多映射迭代器私有多映射成员
【发布时间】:2021-07-12 03:14:30
【问题描述】:

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

#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.**
}

【问题讨论】:

    标签: c++ stl iterator constants multimap


    【解决方案1】:

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

    typedef mm::const_iterator mit;

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

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

    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::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> > > >::iterator'} requested
       31 |   mit it = my_map.begin();
          |            ~~~~~~~~~~~~^
    

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

    std::multimap&lt;int, std::__cxx11::basic_string&lt;char&gt; &gt;::const_iterator

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

    【讨论】:

    • 我想让这个函数为 const 的唯一原因是为了保护性编程(即防止对类成员进行任何意外更改)
    • @yazgiDev 现在我明白了,我改变了答案,我为你提供了 2 个解决方案
    • 好的,我现在明白了。非常感谢 Krug,感谢您的帮助,我一定会在将来包含编译器错误。再次感谢,非常感谢您抽出宝贵时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-09
    • 2021-07-06
    • 1970-01-01
    相关资源
    最近更新 更多