Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème classe template et constructeur de copie

Le compilateur ne reconnait pas la fonction ...

    12 août 2007 à 10:15:11

    Bonjour tout le monde ! Je travaille avec Code::blocks sous Ubuntu.
    Voilà mon problème : j'ai crée une classe template Tableau ( du type liste doublement chaînée ) où je peux retrouver les éléments par leur numéro ou leur indice.
    La classe marche très bien avec des types de base (int, double ... ). :D

    Tout content et fier de moi ( première utilisation des templates ! ;) lol ) Je m'empresse de l'implanter dans un programme plus gros.
    Et là, je compile et message d'erreur : :euh:

    1. /home/pepedeluxe/CodeBlocks/Projects/MoteurPhysique2D/Casse brique circulaire/Physique.cpp:: In member function «void Physique::gestionCollisions(Tableau<std::vector<ObjetD, std::allocator<ObjetD> > >&)":
    2. /home/pepedeluxe/CodeBlocks/Projects/MoteurPhysique2D/Casse brique circulaire/Physique.cpp:249: erreur: no matching function for call to «Tableau<std::vector<ObjetD, std::allocator<ObjetD> > >::Tableau(Tableau<std::vector<ObjetD, std::allocator<ObjetD> > >)"
    3. /home/pepedeluxe/CodeBlocks/Projects/MoteurPhysique2D/Casse brique circulaire/Tableau.tpp:8: note: candidats sont: Tableau<T>::Tableau(Tableau<T>&) [with T = std::vector<ObjetD, std::allocator<ObjetD> >]
    4. :: === Build finished: 2 errors, 0 warnings ===


    La ligne correspondante est la suivante :
    1. Tableau <std::vector <ObjetD> > tmp = CreeTMP(elements) ;


    Où creeTMP est :
    1. Tableau <std::vector <ObjetD> > Physique::CreeTMP(Tableau <std::vector <ObjetD> > elements)
    2. {
    3.     Tableau <std::vector <ObjetD> > tmp = elements ;
    4.     for (int j = 0 ; j < tmp.taille() ; j++)
    5.     {
    6.         for (unsigned int i = 0 ; i < tmp(j).size() ; i++)
    7.         {
    8.             if ( tmp(j)[i].type() == CERCLE )
    9.             {
    10.                 tmp(j)[i].point(0) = tmp(j)[i].point(0) + tmp(j)[i].vitesse()/FPS ;
    11.             }
    12.         }
    13.     }
    14.     return tmp ;
    15. }

    ( donc retourne bien un Tableau <std::vector <ObjetD> > )

    Et mon constructeur de copie est le suivant :

    1. template <typename T>
    2. Tableau <T>::Tableau(Tableau <T> &tableau)
    3. {
    4.     p_curseur = NULL ;
    5.     _taille = tableau._taille ;
    6.     for (int i = 0 ; i < _taille ; i++)
    7.     {
    8.         ajout_fin(tableau(i), tableau.nom(i)) ;
    9.     }
    10.     _curseur = tableau._curseur ;
    11.     deplaceCurseur(_curseur) ;
    12. }


    Je ne vois vraiment pas ce qui coince : je donne le bon type en argument du constructeur de copie, mais apparemment le compilateur ne reconnait pas la signature de mon constructeur de copie...
    Je me doute bien que le fait que ce soit une classe template y est pour quelque chose, mais, pourquoi ça marche pas !!! o_O
    • Partager sur Facebook
    • Partager sur Twitter
      16 août 2007 à 10:16:43

      Pas de réponse tranchée sur ton problème, mais quelques idées :
      - constructeur par recopie : passer le paramètre en const.
      - l'implémentation d'une méthode template se fait dans un .h ou un .hpp si tu veux une portée hors du fichier. En effet, si tu implémentes un template dans un cpp, tu ne pourras t'en servir que dans ce cpp.

      Au niveau remarques sur la conception :
      - pourquoi créer une classe Tableau<> ? qu'est ce que ta classe aura de différent qu'un vector ? si tu déclares un std::vector<std::vector<ObjectD> >, ça ne peut pas faire l'affaire ?
      - Attention aux recopies : tu retournes un vector, il y a donc recopie a ce moment la ! et la recopie d'un vector, ça peut etre très lourd !!
      Ne vaudrait il mieux pas déclarer ta structure a l'extérieur, et la passer par référence a ta fonction, pour éviter des recopies ?
      D'ailleurs, personnellement, quand je fais des classes "lourdes", a ne surtout pas recopier, je me met une sécurité : un constructeur par recopie et un opérateur = bidon (vide) en private : ainsi, je détecte les recopies a la compilation, et je m'assure que je n'en fait pas....
      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

      Problème classe template et constructeur de copie

      × 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