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

Langage C++ Discussion :

const et vecto<T>.begin()


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut const et vecto<T>.begin()
    Bien le bonjour,
    J'ai un petit problème et je vois pas trop comment m'en sortir proprement.
    Petit bout de code pour être plus clair :

    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
    void MaClass::CopySessions(const MaClass& source)
    {
    	_Sessions.clear();
    	int count = source._Sessions.size();
    	if(count)
    	{
    		_Sessions.resize(count);
    		std::vector<Session*>::iterator it = source._Sessions.begin();
    		std::vector<Session*>::const_iterator itEnd = source._Sessions.end();
    		while(it != itEnd)
    		{
    			_Sessions.push_back(*it);
    			it++;
    		}
    	}
    }
    Voilou, donc le principe est de copier la liste des pointeurs de session présents dans une autre instance de la classe MaClass.
    _Session est déclaré comme ca : private: std::vector<Session*> _Session;.

    L'erreur que j'ai est plutot illisible à cause des templates :
    error C2440: 'initialisation'*: impossible de convertir de 'std::_Vector_const_iterator<_Myvec>' en 'std::_Vector_iterator<_Myvec>'
    
    Elle se produit ligne 8, sur l'obtention de l'itérateur begin().

    Donc a ce que je comprend c'est parce que le paramètre de la fonction est déclaré const et du coup le compilo détecte que je vais itérer dans le vecteur pour y faire des changements.

    Comment lui faire comprendre que je ne fais que lire, il n'y a pas de modification du vecteur source et donc le paramètre est bien constant ?

    Je pourrais évidemment virer le mot clef 'const' mais je préfèrerai le garder, il est tout de même sensé indiquer aux autres devs que la fonction ne touche pas à la source ce qui est très important a mon sens.

    Merci pour vos réponses

    (PS : Au cas où ca change quelque chose, je suis sous VS2010)

  2. #2
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    Bonjour,
    Citation Envoyé par ctxnop
    Comment lui faire comprendre que je ne fais que lire, il n'y a pas de modification du vecteur source et donc le paramètre est bien constant ?
    Ben en changeant ton iterator pour un const_iterator, comme le message d'erreur l'indique ?

    std::vector<Session*>::const_iterator it = source._Sessions.begin();

  3. #3
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Par défaut
    Ah, je vennais sur le fofo pour mettre le topic en résolut car je venais de trouver exactement la même solution
    Je ne sais pas pourquoi j'étais convaincu que le const_iterator c'était un itérateur sur lequel on ne peut pas faire it++... Je conçoit que l'intérêt d'un itérateur non-itérable est limité, mais bon, j'avais ca en tête

    Enfin bref, merci tout de même de la réponse

  4. #4
    Membre Expert

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Par défaut
    En fait il me semble que la seule différence entre un const_iterator et un iterator, c'est qu'au lieu de retourner un T& lorsque on le déréférence il retourne un const T&, ce qui empêche donc de modifier l’élément pointé.

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

Discussions similaires

  1. appel de fonction const
    Par pseudemys dans le forum C++
    Réponses: 5
    Dernier message: 15/02/2005, 23h12
  2. static const et taille de tableau
    Par tut dans le forum C++
    Réponses: 3
    Dernier message: 27/01/2005, 16h01
  3. Pb d'nitialisation d'un const char*
    Par davkick dans le forum C++
    Réponses: 9
    Dernier message: 09/12/2004, 16h27
  4. Chaines et pointeurs mais pas "const"
    Par hpfx dans le forum C
    Réponses: 9
    Dernier message: 05/10/2003, 20h23
  5. Query Begin et Commit son sur un bateau....
    Par faoz75 dans le forum Requêtes
    Réponses: 5
    Dernier message: 15/08/2003, 11h48

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