使用的迭代器类型错误
Wrong type of iterator used
我正在实现一个地图作为我的硬件作业的一部分。映射应支持两种类型的迭代器:
- 迭代器 - 允许更改地图。
- 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):
^
这意味着编译器选择了错误的开始/结束方法。
如何解决这个问题?
通过提供从 iterator
到 const_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()
成员函数。
您有多种选择可以避免此问题。
- 在"for"循环中使用迭代器而不是const_iterator
-
定义对象,如下所示:
const Map<string, int> msi;
-
在迭代器类中定义运算符以将 Map::const_iterator 转换为 Map::迭代器
相关文章:
- 类没有命名C++代码中的类型错误
- 不完整类型错误(E0409、E0070、E0515)
- 使用具有结构不完整类型错误的模板
- 不命名构造函数和析构函数上的类型错误
- 返回派生类型时出现协变类型错误
- 为什么此构造函数没有给出不完整的类型错误?
- 定义模板化结构的特征时出现不完整的类型错误
- 使用重载构造函数时出现不完整的类型错误
- 为什么我得到表达式必须有类类型错误?
- 输出 [left]=input[i] 行中的 c++ 代码中存在无效的类型错误
- 枚举成员不是类型错误
- 如何修复"ctypes"。参数错误:参数 2:<键入"异常.类型错误">:RaspberryPi 中的错误类型"错误
- 外部 "C" Visual Studio 2015 中的显式类型错误,DLL 测试代码
- 非默认析构函数会导致不完整的类型错误
- 为什么按引用传入会导致绑定引用类型错误
- Objective-C C++ 包装器 类型错误的不完整定义
- 输入类型错误
- 当构造函数的参数类型错误时引发异常
- 命名空间中的'bad_cast' 'std' 未命名类型错误
- C UNWORKOWN类型错误