Bonjour !
J'essaie d'utiliser boost::iterator_adaptor, mais j'ai quelques soucis.
Mon premier problème :
1 2 3 4 5 6 7 8 9 10 11 12
| #include <boost/iterator_adaptors.hpp>
#include <algorithm>
#include <iostream>
template <class T>
class Reverse : public boost::iterator_adaptor <Reverse<T>, T>
{
public:
Reverse( T IterTemp ) : Reverse<T>::iterator_adaptor_( IterTemp ) {};
void increment( void )
{ --this->base_reference(); }
}; |
Je n'ai défini qu'increment(void), et non increment(int), decrement, etc. pour simplifier l'example, mais les définir donne le même résultat.
Quand je fais :
1 2 3 4 5 6 7
| int main(void)
{
int oh[] = { 3, 5, 7 };
Reverse <int*> ItoBegin( oh + 2 ), ItoEnd( oh - 1 );
std::copy( ItoBegin, ItoEnd, std::ostream_iterator<int>( std::cout, "\n" ) );
return 0;
} |
Et que j'exécute :
1 2
| $ g++ -Wall -o test test.cpp
$ ./test |
Je n'ai pas d'erreur de compilation ni runtime, mais je n'obtient pas d'output. Tandis qu'avec :
1 2 3 4 5 6 7 8 9
| void fonc( int a )
{ std::cout << a << "\n"; }
int main(void)
{
int oh[] = { 3, 5, 7 };
Reverse <int*> ItoBegin( oh + 2 ), ItoEnd( oh - 1 );
std::for_each( ItoBegin, ItoEnd, fonc );
return 0;
} |
J'obtiens :
Comment cela se fait-il ?
Mon deuxième problème :
J'instancie mon Reverse via :
Reverse( T IterTemp ) : Reverse<T>::iterator_adaptor_( IterTemp ) {};
parce que j'ai vu que cela semblait marcher. Cependant, je me demande pourquoi cette ligne est nécessaire. En effet, dans la définition d'iterator_adaptor dans <boost/iterator/iterator_adaptor.hpp>, on trouve :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| template <
class Derived
, class Base
... >
class iterator_adaptor
... {
...
public:
...
explicit iterator_adaptor(Base const &iter)
: m_iterator(iter)
{
}
...
private:
Base m_iterator;
}; |
Or, quand j'essaie de retirer le constructor Reverse( T IterTemp ), pensant que le constructor ci-dessus suffira, j'obtiens :
1 2 3 4
| ...: In function ‘int main()’:
...:21:34: error: no matching function for call to ‘Reverse<int*>::Reverse(int*)’
...:7:1: note: candidates are: Reverse<int*>::Reverse()
...:7:1: note: Reverse<int*>::Reverse(const Reverse<int*>&) |
Comme si le compilateur ignorait l'existence du constructor iterator_adaptor(Base const&iter), ou considérait que Base a pour type Reverse<int*>& et non int*.
Comment cela se fait-il ?
Merci beaucoup !
Partager