使用了错误类型的迭代器

Naf*_*aly 5 c++

我正在实施地图作为我的硬件分配的一部分.该映射应支持两种类型的迭代器:

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

我有以下方法:

Map::const_iterator begin() const;
Map::const_iterator end() const;
Map::iterator begin();
Map::iterator end(); 
Run Code Online (Sandbox Code Playgroud)

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

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

我遇到以下问题:

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): 
                ^
Run Code Online (Sandbox Code Playgroud)

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

我怎么解决这个问题?

jua*_*nza 11

通过从提供的隐式转换iteratorconst_iterator.您可以通过给做const_iterator一个构造函数的iterator,或通过提供iteratorconst_iterator转换操作符.

当你做这种事情时,这种方法在标准库中使用:

std::vector<int> v;
std::vector<int>::const_iterator it = v.begin();
Run Code Online (Sandbox Code Playgroud)

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

std::vector<int> v;
std::vector<int>::const_iterator it = v.cbegin();
Run Code Online (Sandbox Code Playgroud)