我正在实现 map ,这是我的硬件任务的一部分。映射应支持两种类型的迭代器:

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

  • 我有以下方法:
    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 的方法,即使对于非常量实例也​​是如此。但是这些需要不同的名称,因为您不能按返回类型重载:
    std::vector<int> v;
    std::vector<int>::const_iterator it = v.cbegin();
    

    关于c++ - 使用的迭代器类型错误,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21022449/

    10-11 23:15
    查看更多