Как я могу исправить эту ошибку `преобразование из const_iterator в нескалярный тип`? - PullRequest
0 голосов
/ 06 июня 2018

Может кто-нибудь объяснить, что упоминается об этой ошибке:

преобразование из '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;
}

как я могу это исправить?

1 Ответ

0 голосов
/ 06 июня 2018

Вы передаете от const Gen<T> до operator<<.Это означает, что когда вы вызываете g.array.begin(), вы вызываете константную перегрузку begin, которая возвращает const_iterator :

const_iterator begin() const noexcept;

, а затем вы пытаетесь присвоить его vector<T>::iterator,что вызывает ошибку компилятора.Вы можете исправить это так:

auto it = g.array.begin()

, который говорит компилятору выводить правильный тип для it.

...