Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème avec une classe template

Sujet résolu
    15 juin 2007 à 15:30:27

    Bonjour, j'ai un petit problème avec une classe template (gerant une liste chainees mais on s'en fou), mon code est séparé en 3 fichiers:

    main.cpp:

    #include <iostream>
    #include <string>
    #include "liste_cpp\liste_cpp.h"




    int main(void)
    {
        liste<int> a;
        return 0;
    }


    liste_cpp.h:

    #ifndef DEF_LISTE_CPP
    #define DEF_LISTE_CPP

    #include <stdlib.h>
    #include <stdio.h>
    #include <iostream>



    template <typename File>
    class liste
    {
        typedef struct element
        {
            struct element* next;
            File file;
        }element;
        element* m_liste;

        public:
            /* constructeurs destructeurs */
            liste(void);
           
                    /* ... */
    };


    #endif

    et liste_cpp.cpp

    #include "liste_cpp.h"

    using namespace std;

    template <typename File>
    liste<File>::liste(void)
    {
        m_liste=NULL;
    }

    Si je compile comme sa, le compilo me sort: undefined reference to `liste<int>::liste().
    Ce qui est bizard, c'est que si je met le contenu de liste_cpp.cpp dans main.cpp plus aucun problème.

    Merci de votre aide.
    • Partager sur Facebook
    • Partager sur Twitter
      15 juin 2007 à 15:40:49

      est ce que quand tu compiles tes deux fichiers .cpp sont compilés/linkés
      • Partager sur Facebook
      • Partager sur Twitter
        15 juin 2007 à 15:48:25

        Oui ils sont bien linkés et compilés.
        • Partager sur Facebook
        • Partager sur Twitter
          15 juin 2007 à 15:52:56

          Erreur classique.
          cf la FAQ C++ de developpez relativement aux erreurs de links sur les templates.
          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            15 juin 2007 à 15:59:10

            Ok merci de vos réponses je vais voir de ce pas la FAQ.

            Edit: ok donc, si j'ai bien compris, je met l'équivalent de liste_cpp.cpp dans un fichier .tpp et je le link dans le header liste_cpp.h.
            • Partager sur Facebook
            • Partager sur Twitter
              15 juin 2007 à 16:10:54

              Tu inclues seulement le .tpp et linkes les .o générés à partir des .cpp.
              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                15 juin 2007 à 16:33:17

                D'accord sa marche. J'ai une dernière question: si, j'ai par exemple une fonction amie de ma classe liste et que je veux créer une variabale de type element (qui est défini dans ma classe), comment faire pour définir cette variable?
                • Partager sur Facebook
                • Partager sur Twitter
                  15 juin 2007 à 19:30:13

                  Juste un commentaire sur ton code, il vaut mieux utiliser template<typename File> que template<class File>, le mot clé typename a été fait pour éviter les confusions engendrées par class.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 juin 2007 à 19:45:46

                    Ok merci, c'est toujours bon à savoir.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      16 juin 2007 à 12:33:41

                      bad_worker > quel est le rapport entre la fonction amie et le champs element dans ta classe modèle liste ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        16 juin 2007 à 15:03:36

                        Eh bien je voudrait juste pouvoir créé une variable de type element dans une fonction amie mais je ne sait pas comment faire,
                        element ma_variable;
                        ne marche pas.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 juin 2007 à 12:55:27

                          Comme la fonction amie est dans ta classe template, tu dois templater l'implémentation de la fonction amie, pour utiliser Liste<T>::element.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 juin 2007 à 14:40:17

                            Ah oui ok merci beaucoup, je suis trop c** moi je faisait liste::element, j'ai pas pensé que c'était une classe template.
                            • Partager sur Facebook
                            • Partager sur Twitter

                            Problème avec une classe 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