【问题标题】:How can I fix this error `conversion from const_iterator to non-scalar type`?如何修复此错误“从 const_iterator 转换为非标量类型”?
【发布时间】: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&lt;T&gt;::const_iterator,应该可以。
  • 比较密集,但是仔细阅读错误信息。它抱怨将std::vector&lt;int&gt;::const_iterator 转换为std::vector&lt;int&gt;::iterator。这是一个问题,因为iterator 允许您分配它指向的东西,但const_iterator 不允许。容器是 const 的,所以你不能修改它的元素。通过练习,这些错误消息变得更容易破译。

标签: c++ c++11 vector iterator


【解决方案1】:

您将const Gen&lt;T&gt; 传递给operator&lt;&lt;。这意味着当您调用 g.array.begin() 时,您正在调用 begin 的 const 重载,它返回 const_iterator

const_iterator begin() const noexcept;

然后您尝试将其分配给vector&lt;T&gt;::iterator,这会导致编译器错误。你可以这样解决这个问题:

auto it = g.array.begin()

告诉编译器推断it的正确类型。

【讨论】:

  • 我可以通过某种方式将const_iterator 转换为iterator 吗?
  • 没有。你为什么想要?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-01
  • 2012-10-27
相关资源
最近更新 更多