Я написал OutputIterator для answer to another question. Вот оно:Почему мой пользовательский итератор не работает с копией STL?
#include <queue>
using namespace std;
template< typename T, typename U >
class queue_inserter {
queue<T, U> &qu;
public:
queue_inserter(queue<T,U> &q) : qu(q) { }
queue_inserter<T,U> operator ++ (int) { return *this; }
queue_inserter<T,U> operator *() { return *this; }
void operator = (const T &val) { qu.push(val); }
};
template< typename T, typename U >
queue_inserter<T,U> make_queue_inserter(queue<T,U> &q) {
return queue_inserter<T,U>(q);
}
Это прекрасно работает для этой маленькой функции копирования:
template<typename II, typename OI>
void mycopy(II b, II e, OI oi) {
while (b != e) { *oi++ = *b++; }
}
Но это не работает для СТЛ copy
из algorithms
. Вот замечательные ошибки C++ я получаю:
i.cpp:33: error: specialization of ‘template<class _Iterator> struct std::iterator_traits’ in different namespace
/usr/include/c++/4.0.0/bits/stl_iterator_base_types.h:127: error: from definition of ‘template<class _Iterator> struct std::iterator_traits’
/usr/include/c++/4.0.0/bits/stl_algobase.h: In function ‘_OI std::__copy_aux(_II, _II, _OI) [with _II = int*, _OI = queue_inserter<int, std::deque<int, std::allocator<int> > >]’:
/usr/include/c++/4.0.0/bits/stl_algobase.h:335: instantiated from ‘static _OI std::__copy_normal<true, false>::copy_n(_II, _II, _OI) [with _II = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, _OI = queue_inserter<int, std::deque<int, std::allocator<int> > >]’
/usr/include/c++/4.0.0/bits/stl_algobase.h:387: instantiated from ‘_OutputIterator std::copy(_InputIterator, _InputIterator, _OutputIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, _OutputIterator = queue_inserter<int, std::deque<int, std::allocator<int> > >]’
i.cpp:53: instantiated from here
/usr/include/c++/4.0.0/bits/stl_algobase.h:310: error: no type named ‘value_type’ in ‘struct std::iterator_traits<queue_inserter<int, std::deque<int, std::allocator<int> > > >’
/usr/include/c++/4.0.0/bits/stl_algobase.h:315: error: no type named ‘value_type’ in ‘struct std::iterator_traits<queue_inserter<int, std::deque<int, std::allocator<int> > > >’
/usr/include/c++/4.0.0/bits/stl_algobase.h:315: error: ‘__value’ is not a member of ‘<declaration error>’
/usr/include/c++/4.0.0/bits/stl_algobase.h:335: instantiated from ‘static _OI std::__copy_normal<true, false>::copy_n(_II, _II, _OI) [with _II = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, _OI = queue_inserter<int, std::deque<int, std::allocator<int> > >]’
/usr/include/c++/4.0.0/bits/stl_algobase.h:387: instantiated from ‘_OutputIterator std::copy(_InputIterator, _InputIterator, _OutputIterator) [with _InputIterator = __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >, _OutputIterator = queue_inserter<int, std::deque<int, std::allocator<int> > >]’
i.cpp:53: instantiated from here
/usr/include/c++/4.0.0/bits/stl_algobase.h:317: error: ‘__simple’ is not a valid template argument for type ‘bool’ because it is a non-constant expression
/usr/include/c++/4.0.0/bits/stl_algobase.h:317: error: ‘copy’ is not a member of ‘<declaration error>’
Вот водитель:
int main() {
vector<int> v;
v.push_back(1);
v.push_back(2);
queue<int> q;
copy(v.begin(), v.end(), make_queue_inserter(q));
while (q.size() > 0) {
cout << q.front() << endl;
q.pop();
}
}
Почему в мире это, специализирующимся iterator_traits
. Что случилось с моим итератором? Разве я не могу написать свои простые итераторы?
И как алгоритм должен знать, что такое _kind_ итератора? Например, алгоритм может работать быстрее с Итераторами случайного доступа, но как он знает, является ли ваш итератор произвольным доступом или нет? –
Поскольку все ваши итераторы должны начинаться так: struct queue_inserter: boost :: iterator_facade <...> {... ' – alfC
@alfC: FWIW, я просто попробовал написать простой OutputIterator с' boost :: iterator_facade' и сразу же столкнулся с проблемой. http://stackoverflow.com/questions/43481025 Поскольку OP был * также * пытается создать OutputIterator, «' iterator_facade' решает все ваши проблемы по магии »- это не полезно. Оказывается, 'iterator_facade' * создает * некоторые свои проблемы. (Тем не менее, вероятно, следует использовать его, но это не однострочный ответ.Это многострочный ответ с несколькими оговорками и, надеюсь, пример.) – Quuxplusone