使用的迭代器类型错误

Wrong type of iterator used

本文关键字:类型 错误 迭代器      更新时间:2023-10-16

我正在实现一个地图作为我的硬件作业的一部分。映射应支持两种类型的迭代器:

  • 迭代器 - 允许更改地图。
  • constant_iterator - 不允许更改地图。

我有以下方法:

Map::const_iterator begin() const;
Map::const_iterator end() const;
Map::iterator begin();
Map::iterator end(); 

但是,当我使用以下代码测试我的实现时:

for(Map<std::string,int>::const_iterator it = msi.begin(); it != msi.end(); ++it) {
    std::cout << *it << std::endl;
}

我遇到以下问题:

map_test.cpp:49:43: error: no viable conversion from 'Map<basic_string<char>, int>::iterator' to 'Map<std::string, int>::const_iterator'
        for(Map<std::string,int>::const_iterator it = msi.begin(); it != msi.end(); ++it) {
                                                 ^    ~~~~~~~~~~~
./map_new.h:57:3: note: candidate constructor not viable: no known conversion from 'Map<basic_string<char>, int>::iterator' to 'const
      Map<basic_string<char>, int>::const_iterator &' for 1st argument
                const_iterator(const Map<KeyType, DataType>::const_iterator& sIterator): 
                ^

这意味着编译器选择了错误的开始/结束方法。

如何解决这个问题?

通过提供从 iteratorconst_iterator 的隐式转换。你可以通过给const_iterator一个接受iterator的构造函数,或者为iterator提供一个const_iterator转换运算符来做到这一点。

当您执行此类操作时,在标准库中使用此方法:

std::vector<int> v;
std::vector<int>::const_iterator it = v.begin();

在 C++11 中,您有直接返回 const_iterators 的方法,即使对于非 const 实例也是如此。但是这些需要不同的名称,因为不能按返回类型重载:

std::vector<int> v;
std::vector<int>::const_iterator it = v.cbegin();
您还可以

创建将返回 const 迭代器的 cbegin()cend()成员函数。

您有多种选择可以避免此问题。

  1. 在"for"循环中使用迭代器而不是const_iterator
  2. 定义对象,如下所示:

    const Map<string, int> msi;
    
  3. 在迭代器类中定义运算符以将 Map::const_iterator 转换为 Map::迭代器