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 :

problèmes d'itérateurs ?


Sujet :

C++

  1. #1
    Membre habitué Avatar de BioKore
    Homme Profil pro
    .
    Inscrit en
    septembre 2016
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : septembre 2016
    Messages : 274
    Points : 198
    Points
    198
    Par défaut problèmes d'itérateurs ?
    Bonjour à tous,

    Je viens vers vous car je pense avoir un petit problème d'itérateurs concernant un simple wrapper de std::vector.

    Typiquement, voici ma classe :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    template<typename T>
    	class vector {
    	public:
    		using iterator = typename std::vector<T>::iterator;
    		using const_iterator = typename std::vector<T>::const_iterator;
    	private:
    		std::vector<T> data;
     
    	public:
    		vector(size_t const count);
    		vector(size_t const count, T const & val);
     
    		size_t size() const { return data.size(); };
     
    		T & operator[](size_t const id);
    		T const & operator[](size_t const id) const;
     
    		iterator begin() { return data.begin(); };
    		iterator end() { return data.end(); };
    		const_iterator cbegin() const { return data.cbegin(); };
    		const_iterator cend() const { return data.cend(); };
     
    		void push(T const & val);
    		void pop();
    		void clear();
     
     
    		// OPERATORS
    		vector<T> & operator=(vector<T> const & src);
    		vector<T> & operator=(T const & src);
     
    		vector<T> & operator+=(vector<T> const & src);
    		vector<T> & operator+=(T const & src);
     
    		vector<T> & operator-=(vector<T> const & src);
    		vector<T> & operator-=(T const & src);
     
    		vector<T> & operator*=(vector<T> const & src);
    		vector<T> & operator*=(T const & src);
     
    		vector<T> & operator/=(vector<T> const & src);
    		vector<T> & operator/=(T const & src);
     
    		bool operator==(vector<T> const & src) const;
    		bool operator!=(vector<T> const & src) const;
     
     
    	};
    Cependant, lorsque je tente de l'utiliser avec des "range-based for loops" en const ça bug :
    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
    // ceci ne compile pas
    template<typename T>
    void list(slm::vector<T> const & src) {
    	for(auto & v:src) {
    		std::cout << v << ' ';
    	}
    	std::cout << '\n';
    }
    // alors que ceci oui...
    template<typename T>
    void list(std::vector<T> const & src) {
    	for(auto & v:src) {
    		std::cout << v << ' ';
    	}
    	std::cout << '\n';
    }
    // et ceci aussi
    template<typename T>
    void list(slm::vector<T> & src) {
    	for(auto & v:src) {
    		std::cout << v << ' ';
    	}
    	std::cout << '\n';
    }
    Message de g++ :
    error: passing ‘const slm::vector<float>’ as ‘this’ argument discards qualifiers [-fpermissive]
    for(auto & v:src) {
    Une idée de ce que je dois apporter à mon code ?

    Merci d'avance !

  2. #2
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    juin 2011
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : juin 2011
    Messages : 677
    Points : 3 284
    Points
    3 284
    Par défaut
    Il te faut implémenter begin et end en const (cbegin/cend ne sont pas utilisées avec avec for)

  3. #3
    Membre habitué Avatar de BioKore
    Homme Profil pro
    .
    Inscrit en
    septembre 2016
    Messages
    274
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : septembre 2016
    Messages : 274
    Points : 198
    Points
    198
    Par défaut
    Bonjour et merci pour l'info.

    Bien entendu, j'avais essayé toutes les possibilités sauf celle qui fonctionne : const_iterator begin() const { return data.cbegin(); };Merci pour le coup de pouce !

    Sujet résolu.

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

Discussions similaires

  1. STL Problème d'itérateur
    Par Pg043 dans le forum SL & STL
    Réponses: 11
    Dernier message: 25/02/2011, 13h20
  2. Problème d'itérateur et de vecteur
    Par befast dans le forum C++
    Réponses: 1
    Dernier message: 19/10/2006, 20h47
  3. Réponses: 2
    Dernier message: 10/04/2006, 20h40
  4. Problême avec les algos, itérateurs ...
    Par R'SKaP dans le forum C++
    Réponses: 14
    Dernier message: 19/12/2005, 00h14
  5. [STL]Problème itérateur avec list
    Par Fiquet dans le forum SL & STL
    Réponses: 7
    Dernier message: 03/10/2005, 18h54

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