Bonjour !

J'essaie d'utiliser boost::iterator_adaptor, mais j'ai quelques soucis.
Mon premier problème :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
        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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 !