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é
    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
    Il te faut implémenter begin et end en const (cbegin/cend ne sont pas utilisées avec avec for)

  3. #3
    Membre habitué
    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.