Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec une classe Matrix 2D template

Nickel avec des int, mais ne compile pas avec des bool

Sujet résolu
    6 août 2008 à 11:09:36

    Salut à tous!
    Je me suis créé une classe template pour gérer des tableaux dynamiques 2D. Elle fonctionnait parfaitement avec des int... jusqu'a ce que j'essaye avec des bool.

    Code:

    #include <vector>
    #include <iostream>
    
    template <typename T>
    class Matrix
    {
    
    
    
        public:
            Matrix();
            Matrix(unsigned int largeur, unsigned int hauteur);
            ~Matrix();
    
            void resize(unsigned int largeur, unsigned int hauteur);
            void clear();
    
            T& operator() (unsigned int x, unsigned int y);
            T  operator() (unsigned int x, unsigned int y) const;
    
        private:
            unsigned int m_largeur, m_hauteur;
            std::vector<T> m_data;
    
    };
    
    
    template <typename T>
    Matrix<T>::Matrix():
    m_largeur(0),
    m_hauteur(0) {}
    
    template <typename T>
    Matrix<T>::~Matrix() {}
    
    template <typename T>
    Matrix<T>::Matrix(unsigned int largeur, unsigned int hauteur):
    m_largeur(largeur),
    m_hauteur(hauteur)
    {
        m_data.resize(largeur*hauteur);
    }
    
    template <typename T>
    T& Matrix<T>::operator() (unsigned int x, unsigned int y)
    {
        if( x >= m_largeur || y >= m_hauteur )
        {
            throw("Erreur: requête d'un élément inexistant.\n");
        }
        return m_data[y + x*m_hauteur];
    }
    
    template <typename T>
    T Matrix<T>::operator() (unsigned int x, unsigned int y) const
    {
        if( x >= m_largeur || y >= m_hauteur )
        {
            throw("Erreur: requête d'un élément inexistant.\n");
            return m_data[0];
        }
        return m_data[y + x*m_hauteur];
    }
    
    
    template <typename T>
    void Matrix<T>::clear()
    {
        m_data.clear();
        m_hauteur = 0;
        m_largeur = 0;
    }
    
    template <typename T>
    void Matrix<T>::resize(unsigned int largeur, unsigned int hauteur)
    {
        clear();
        m_hauteur = hauteur;
        m_largeur = largeur;
        m_data.resize(largeur*hauteur);
    }
    
    using namespace std;
    
    int main()
    {
        Matrix<int> a(4,3);   
        a(1,1)++;
        cout << a(1,1) << endl;
    
        Matrix<bool> b(5,4);   
        b(2,2)++;                  // A partir d'ici, ca bug
        cout << b(2,2) << endl;
        return 0;
    }
    


    L'erreur de g++ est: erreur: invalid initialization of non-const reference of type «bool&» from a temporary of type «std::_Bit_reference».

    Sachant que sans les bool, tout est OK!

    Merci de votre aide.

    A+,

    Loumnam.

    P.S: Je n'ai evidemment pas affiché la totalité de ma classe Matrix.
    • Partager sur Facebook
    • Partager sur Twitter
      6 août 2008 à 12:01:24

      std::vector<bool> a un comportement très spécial et il ne fonctionne pas de la même manière. Je te laisse regarder la doc pour trouver ce qu'il te faut modifier.

      De manière générale, on évite vector<bool>.
      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        6 août 2008 à 12:05:05

        Donc tu devrais faire une spécialisation de ta classe !
        • Partager sur Facebook
        • Partager sur Twitter

        Problème avec une classe Matrix 2D template

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown