2010-02-01 17 views
2

J'essaye d'écrire un simple itérateur STL pour la classe CArray MFC en utilisant l'adaptateur itérateur boost. Ceci est mon code:Erreur de compilation avec l'adaptateur d'itérateur boost

#include <boost/iterator/iterator_adaptor.hpp> 
#include <afxtempl.h> 

class CArrIter : public boost::iterator_adaptor< CArrIter , 
    int, 
    int, 
    boost::random_access_traversal_tag > 
{ 
public: 
    CArrIter(CArray<int,int>& arr, int index = 0) : m_arr(arr) 
    { 
     this->base_reference() = index; 
    } 

private: 
    friend class boost::iterator_core_access; 
    int dereference() const{ 
     return m_arr.GetAt(base()); 
    } 


private: 
    CArray<int,int>& m_arr; 
}; 

Cette compile bien avec le compilateur VC9. Mais quand j'essaye de compiler ceci avec VC7 j'obtiens l'erreur suivante:

\include\boost\iterator\iterator_traits.hpp(49) : erro r C2039: 'difference_type' : is not a member of 'boost::detail::iterator_traits< Iterator>' with [ Iterator=int ]

\include\boost\mpl\eval_if.hpp(41) : see refer ence to class template instantiation 'boost::iterator_difference' bein g compiled with [ Iterator=int ]

.... Some more ....

Des indices ce qui pourrait se tromper? Je dois inclure d'autres fichiers d'en-tête? Je suis assez nouveau pour booster la bibliothèque.

Répondre

0

Cela peut être dû au fait que le comportement d'accès aléatoire ne dispose pas de tout ce dont il a besoin pour traverser le conteneur. La section « exigences iterator_adaptor » de ce lien pourrait aider:

Boost: Iterator Adapter

Je ne sais pas si int est cessible, alors je me demande ce qui se passerait si vous avez changé int int &.

quelques autres idées:

  • Utilisez-vous la même version de la bibliothèque Boost avec les deux compilateurs?
  • Est-ce que dereference() est protégé ou public?
4

Je pense que le deuxième paramètre de template de boost :: iterator_adaptor > doit être un type d'itérateur valide, essayez d'utiliser int * au lieu de int.

+0

En effet, le second argument (Base) sera utilisé pour déterminer les types par défaut pour le reste, en lui passant l'équivalent de 'std :: iterator_traits'. Puisque OP ne spécifie pas 'difference_type', la compilation échoue quand boost tente de le faire avec' boost :: detail :: iterator_traits ' – UncleBens

+0

mais pourquoi compiler avec VC9 alors? – Naveen

+0

@Naveen: Je ne sais pas. Mais maintenant que j'y pense, peut-être que ce dont vous avez besoin est en fait iterator_facade? http://www.boost.org/doc/libs/1_41_0/libs/iterator/doc/iterator_facade.html – Manuel