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

C++ Discussion :

erreur avec mon const_reverse_iterator


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut erreur avec mon const_reverse_iterator
    Bonjour, j'ai un code qui ne compile pas avec g++ mais qui compile et s'exécute parfaitement bien avec Visual 2005. Voici ma fonction

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    void Cah::typologie(set<int> & s, double diff)
    {
      double ind;
      int num;
      vpClasse::const_reverse_iterator it = _desc.rbegin();
      s.insert((*it)->getAine());
      s.insert((*it)->getBenj());
      set<int>::iterator sit;
     
      it++;
     
      for( ; it != _desc.rend() ; it++)
      {
    	ind = (*it)->getIndice();
    	num = (*it)->getNum();
    	if(ind > diff)
    	{
    	  /* si num est un element de s on le supprime */
    	  sit = s.find(num);
    	  if(sit != s.end()) s.erase(sit); /* sit == s.end() : l'element n'a pas ete trouve */
     
          s.insert((*it)->getAine());
    	  s.insert((*it)->getBenj());
    	}
    	else
    	  break;
      } /* for( ; it != _desc.end() ; it++) */
    }
    L'erreur a lieu à la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for( ; it != _desc.rend() ; it++)
    et g++ dit :

    Sources/cah.cpp: In member function `void Cah::typologie(std::set<int,
    std::less<int>, std::allocator<int> >&, double)':
    Sources/cah.cpp:438: error: no match for `
    std::reverse_iterator<__gnu_cxx::__normal_iterator<Classe* const*,
    std::vector<Classe*, std::allocator<Classe*> > > >& !=
    std::reverse_iterator<__gnu_cxx::__normal_iterator<Classe**,
    std::vector<Classe*, std::allocator<Classe*> > > >' operator
    Savez-vous comment résoudre ce problème ?

    Merci d'avance

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    C'est quoi vpClasse ?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    1 298
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 298
    Points : 886
    Points
    886
    Par défaut
    Citation Envoyé par Goten Voir le message
    C'est quoi vpClasse ?
    Salut

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef std::vector< Classe * > vpClasse;

  4. #4
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    le type de _desc est le même ?

    On dirait que tu as un problème de const transtypage. Tu n'aurais pas des const quelque part que tu montres pas dans le code ?

    Ne pas oublier que std::vector< Classe* > n'est pas la même chose que std::vector< Classe const * > !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    394
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 394
    Points : 473
    Points
    473
    Par défaut
    A première vue, je dirais que tu as un problème de "const-correctness".
    Tu essaies de comparer un "const_reverse_iterator" avec un "reverse_iterator"

    le retour _desc.rend() dépend du qualificateur de _desc au moment de l'appel. Soit :
    • un "reverse_iterator" si _desc n'est constant
    • un "const_reverse_iterator is _desc est constant

    J'imagine que _desc est une variable d'instance de ta classe non déclarée constante.

    Comme la déclaration de ta fonction membre "typologie()" n'est pas constante, _desc ne le sera pas dans le corps de la fonction.

    Ca te laisse deux choix:
    • Soit typologie ne modifie pas les variables de ta classe, alors il faut la définir comme telle: "typologie(...) const"
    • Soit typologie modifie l'état de l'instance, alors "it" ne doit pas être constant

  6. #6
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Points : 15 620
    Points
    15 620
    Par défaut
    J'aurais dit pareil de Jan...

    Il y a 2 fonction rend() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    reverse_iterator rend();
    const_reverse_iterator rend() const;
    La ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vpClasse::const_reverse_iterator it = _desc.rbegin();
    suffit à indiquer au compilateur quel est la "bonne" fonction à utiliser. Par contre, quand tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(; it != _desc.rend(); ++it)
    le compilateur choisit par défaut la fonction sans const. L'erreur provient du fait qu'il n'existe pas d'opérateur != permettant de comparer un const_iterator et un iterator.

    Le mieux est de mettre ta fonction en const si _desc n'est pas modifié.

    Une troisième possibilité est de "forcer" le compilateur a appeler la "bonne" fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    vpClasse::const_reverse_iterator itEnd = _desc.rend();
     
    for( ; it != itEnd ; it++)
    {}

    Par contre, j'ai testé ce code et je n'ai pas eu d'erreur de compilation (et en fait, ça m'étonne)

  7. #7
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    le retour _desc.rend() dépend du qualificateur de _desc au moment de l'appel. Soit :
    un "reverse_iterator" si _desc n'est constant
    un "const_reverse_iterator is _desc est constant
    Non.

    reverse_iterator est implicitement convertible vers const_reverse_iterator, et c'est ce qui se passe ici.

    Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main()
    {
    	std::vector<int>::const_reverse_iterator itconst;
    	std::vector<int>::reverse_iterator it;
     
    	std::vector<int> v;
    	it = v.begin();
    	itconst = it; // valide
     
    	if( itconst != it ) // valide
    	{
     
    	}
    }
    C'est l'inverse qui est illégal:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int main()
    {
    	typedef const std::vector<int> const_vector;
    	const_vector::const_reverse_iterator itconst;
    	const_vector::reverse_iterator it;
     
    	const_vector v;
    	itconst = v.rbegin();
    	it = v.begin(); // invalide
    }
    le compilateur choisit par défaut la fonction sans const. L'erreur provient du fait qu'il n'existe pas d'opérateur != permettant de comparer un const_iterator et un iterator.
    Le compilateur choisit la surcharge qui correspond. Ici: reverse_iterator::operator!= const qui prend2 un reverse_iterator const, vu que reverse_iterator est implicitement convertible en const_reverse_iterator; mieux, const_reverse_iterator c'est reverse_iterator const

Discussions similaires

  1. erreur avec mon webService :Unable to create StAX reader or writer
    Par mystro7200 dans le forum Services Web
    Réponses: 0
    Dernier message: 01/02/2010, 19h17
  2. erreur avec mon script newsletter
    Par Tchupa dans le forum Langage
    Réponses: 1
    Dernier message: 26/05/2008, 12h05
  3. Erreur avec mon serveur MySQL
    Par mimi51340 dans le forum Général Java
    Réponses: 1
    Dernier message: 29/03/2008, 12h19
  4. des messages d'erreurs avec mon code
    Par ulysse031 dans le forum Langage
    Réponses: 15
    Dernier message: 25/05/2007, 18h14
  5. Erreur avec mon isset ?
    Par Bne dans le forum Langage
    Réponses: 2
    Dernier message: 25/12/2006, 19h16

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