我正在实施地图作为我的硬件分配的一部分。该映射应支持两种类型的迭代器:
我有以下方法:
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):
^
这意味着编译器选择了错误的开始/结束方法。
我该如何解决这个问题?
答案 0 :(得分:11)
提供从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();
答案 1 :(得分:2)
您还可以创建将返回const迭代器的cbegin()
和cend()
成员函数。
答案 2 :(得分:2)
您有几种方法可以避免此问题。
定义如下对象:
const Map<string, int> msi;
在迭代器类中定义运算符,将Map :: const_iterator转换为Map :: iterator