Контейнеры должны предоставлять iterator
как тип, конвертируемый в const_iterator
, поэтому вы можете неявно преобразовывать:
Container::iterator it = /* blah */;
Container::const_iterator cit = it;
std::insert_iterator
s - итераторы вывода. Это не дает возможности преобразовать их в обычный Container::iterator
, который должен быть прямым итератором.
Итератор вставки другого типа может разрешать такие вещи, но те, что получены из стандартных функций, не позволяют.
Полагаю, вы можете написать свою собственную обертку вокруг std::insert_iterator
, которая выставляет защищенного члена iter
, хотя:
template <typename Container>
class exposing_insert_iterator : public std::insert_iterator<Container> {
public:
exposing_insert_iterator(std::insert_iterator<Container> it)
: std::insert_iterator<Container>(it) {}
typename Container::iterator get_iterator() const {
return std::insert_iterator<Container>::iter;
}
};
// ...
std::insert_iterator<Container> ins_it;
exposing_insert_iterator<Container> exp_it = ins_it;
Container::iterator it = exp_it.get_iterator();