IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Problème avec const_reverse_iterator


Sujet :

SL & STL C++

  1. #1
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Par défaut Problème avec const_reverse_iterator
    Bonjour à tous,

    je souhaite manipuler une liste avec un itérateur "reverse".
    Pas de problème avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::list<int>::reverse_iterator UnRIterateur;	
    UnRIterateur = MaListe.rbegin();
    Par contre j'ai voulu faire la même chose mais avec un itérateur constant cette fois-ci (pour protéger les données de la liste)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    std::list<int>::const_reverse_iterator UnRIterateurConstant;
    UnRIterateurConstant = MaListe.rbegin();
    La deuxième ligne ne compile pas, j'obtiens l'erreur C2679. Je ne comprends pas pourquoi en fait, car dans la MSDN, rbegin() est bien cité comme pouvant rendre un itérateur constant.
    Ce qui me surprend, c'est que la manipulation de begin() avec des itérateurs constants non "reverse" ne me pose pas de problème.

    Si vous avez des pistes ! Merci...

    Je suis sous VC6.

    Guilhem.

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Par défaut
    Tu peux nous donner l'erreur que donne ton compilo et non sont numero stp

  3. #3
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Par défaut
    La voilà :

    error C2679: binary '=' : no operator defined which takes a right-hand operand of type 'class std::reverse_bidirectional_iterator<class std::list<int,class std::allocator<int> >:
    :iterator,int,int &,int *,int>' (or there is no acceptable conversion)

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Par défaut
    Sous g++ 3.3 je ne rencontre aucun problème avec ton code. MaListe est-elle bien du type std::list<int> ?

  5. #5
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Par défaut
    Salut,

    oui elle l'est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::list<int> MaListe;
    Je la remplis ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    MaListe.push_back(38);				
    MaListe.push_back(26);				
    MaListe.push_back(73);
    Après une recherche sur Google http://www.talkaboutprogramming.com/group/comp.lang.c++/messages/725240.html il semblerait que quelqu'un d'autre soit tombé sur cette erreur (sur une map cette fois).

    Onap, si tu as un peu de temps, est-ce que tu pourrais essayer de compiler mon code, je l'ai mis sur http://guilhem-martin.org/pb_constreverse.txt pour voir ce qu'il donne avec ton compilo ?

    Merci,

    Guilhem.

  6. #6
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Par défaut
    Une seul chose n'est pas conforme à la norme: la fonction main renvoie un int donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    void main() ====> int main()
    Sinon aucun problème a la compil, ni a l'execution
    Je n'ai pas regarder tous les messages que ton code affiche (sorry mais pas le temps ce soir), mais tu peux les retrouver ici:
    http://users.skynet.be/sb301801/

  7. #7
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Par défaut
    Super, merci beaucoup.

    La sortie est tout à fait correcte.

    Le problème est donc du côté de VC6. Je n'utilise pas stlport, c'est peut-être bien la source de mon pb...

    Guilhem.

  8. #8
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Par défaut
    Manifestement c'est un bug sous VC6, moi je travail sous Builder au bloulot, j'essayerai lundi pour savoir.
    Sinon essaie comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::list<int>::const_reverse_iterator UnRIterateurConstant= MaListe.rbegin();

  9. #9
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Une question : As tu patché la bibliothèque de VC6 ? Celle livrée par défaut contient certains bugs. Tu peux trouver les patchs sur http://www.dinkumware.com/vc_fixes.html
    Mais bon, je n'ai rien l'air d'y voir qui corresponde à ton problème.


    J'ai essayer ton code avec VC++8.0. Il compile et tourne sans problème (quand on commente les deux lignes ou un commentaire indique que ça ne marche pas, et où le programme s'arrête avec une belle erreur).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Par défaut
    @onap

    L'écriture condensée que tu proposes génère malheureusement une autre erreur :
    error C2440: 'initializing' : cannot convert from 'class std::reverse_bidirectional_iterator<class std::list<int,class std::allocator<int> >::iterator,int,int &,int *,int>' to 'c
    lass std::reverse_bidirectional_iterator<class std::list<int,class std::allocator<int> >::const_iterator,int,int const &,int const *,int>'
    No constructor could take the source type, or constructor overload resolution was ambiguous
    @JolyLoic
    C'est la version livrée par défaut. Merci pour l'URL je vais appliquer le patch et voir ce que cela donne.

    @tous
    Au boulot je suis sous .Net, ça devrait donc mieux marcher (j'ai entendu dire que la stl sous .Net se rapprochait plus du standard).

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Par défaut
    Pour info, le patch SP6 pour VC6 ne corrige pas le problème.

    Guilhem.

  12. #12
    Membre expérimenté
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    336
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 336
    Par défaut
    Pour finir, j'ai pu compiler & exécuter sans problème avec VC7.1.

    J'ai rencontré par ailleurs un autre problème avec VC6, en utilisant remove_if :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    MaListe.remove_if(  est_impaire<int>() );
    avec est_impaire comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    template <class T> class est_impaire : public std::unary_function<T, bool> 
    {
    public:
       bool operator( ) ( T& val ) 
       {
       return ( val % 2 ) == 1;		// Si le nombre est paire, le modulo 2 est égale à 0, l'égalité n'est pas vérifié et donc la valeur false est renvoyée
       }
    };
    me génère cette erreur :

    error C2664: 'remove_if' : cannot convert parameter 1 from 'class est_impaire<int>' to 'class std::binder2nd<struct std::not_equal_to<int> >'
    No constructor could take the source type, or constructor overload resolution was ambiguous
    alors qu'avec VC7, aucun problème.

    Merci à JolyLoic et onap pour leur aide,
    Guilhem.

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    En ce qui concerne la seconde erreur, c'est dû au fait que VC6 ne supporte pas les fonctions membres templates de classes templates. Ce sera pareil pour les constructeurs de conteneur prenant en entrée une paire d'itérateurs, les fonctions membres prenant un ofncteur, ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [subversion/trac] Probl. de permission avec authz dans svnserve.conf
    Par mcdeffice dans le forum Administration système
    Réponses: 0
    Dernier message: 23/07/2009, 16h21
  2. Réponses: 4
    Dernier message: 03/07/2006, 18h13
  3. probl avec swing, tuto pas tres clair
    Par Marc_3 dans le forum AWT/Swing
    Réponses: 13
    Dernier message: 24/03/2006, 15h51
  4. Probl avec décimales s/ base Access et D7
    Par bzh56 dans le forum Bases de données
    Réponses: 2
    Dernier message: 29/07/2005, 12h36
  5. Proble avec un vhosts sous Apache (Mandrake 10.1)
    Par __fabrice dans le forum Apache
    Réponses: 2
    Dernier message: 27/05/2005, 13h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo