【发布时间】:2018-11-15 12:38:45
【问题描述】:
有人能解释一下这个错误是什么意思吗:
从 'std::vector
>::const_iterator {aka __gnu_cxx::__normal_iterator 转换>}' 到非标量类型 'std::vector >::iterator {aka __gnu_cxx::__normal_iterator > >}' 请求
给定以下课程:
#include <vector>
#include <iostream>
using std::vector;
using std::ostream;
template<class T>
class Gen {
vector<T> array;
public:
explicit Gen(int size);
template<class S>
friend ostream& operator<<(ostream& os, const Gen<S>& g);
};
template<class T>
Gen<T>::Gen(int size) {
for (int i = 0; i < size; i++) {
this->array.push_back(T());
}
}
template<class T>
ostream& operator<<(ostream& os, const Gen<T>& g) {
for (typename vector<T>::iterator it = g.array.begin(); it != g.array.end();
it++) { // ****** error ********
os << *it << " ";
}
return os;
}
int main() {
Gen<int> g(3);
std::cout << g << std::endl;
}
我该如何解决这个问题?
【问题讨论】:
-
@MohammadKanan 如果不定义新的迭代器类,我就无法做到?
-
改用
typename vector<T>::const_iterator,应该可以。 -
比较密集,但是仔细阅读错误信息。它抱怨将
std::vector<int>::const_iterator转换为std::vector<int>::iterator。这是一个问题,因为iterator允许您分配它指向的东西,但const_iterator不允许。容器是 const 的,所以你不能修改它的元素。通过练习,这些错误消息变得更容易破译。