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

Langage C++ Discussion :

Définition de méthodes pour une classe template


Sujet :

Langage C++

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Définition de méthodes pour une classe template
    Salut!

    J'ai essayé d'implémenter une liste doublement chainée comme classe template.
    Mais je ne suis pas arriver à définir les méthodes de la classe à l'extérieur de celle-ci et ai du les "rapatrier" à l'intérieur.
    Voici une illustration minimale du problème:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<typename T>                         
    class A{                    
          T n;
          A(T a):n(a){};
          T* createPointer();
          };
     
    T* A::createPointer(){
                       return &n;
                       }
    Le compilo, g++ avec DevC++, me renvoie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    27 C:\DOCUME~1\PROPRI~1\Bureau\main_test.cpp expected constructor, destructor, or type conversion before '*' token 
    27 C:\DOCUME~1\PROPRI~1\Bureau\main_test.cpp expected `,' or `;' before '*' token
    venant du fait qu'il ne comprend pas ce T qui en dehors de la classe n'a pas de signification.

    Sinon tout est bon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<typename T>                         
    class A{                    
    private:
            T n;
    public: 
            A(T a):n(a){};
            T* createPointer(){
                       return &n;
                       }      
          };
    marche sans problème.

    Comment créer proprement les méthodes d'une classe template en dehors de celle-ci?

    Merci de votre aide.

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Il faut mettre aussi un template avant
    Et pouquoi ne pas tout mettre dans la classe ?

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Citation Envoyé par Miles
    Il faut mettre aussi un template avant
    Je voit pas où.
    Et pouquoi ne pas tout mettre dans la classe ?
    C'est juste une question de bonne présentation et organisation du code.

  4. #4
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Devant la définition de ta méthode qui est séparée de la classe.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template <typename T>
    T* A::createPointer(){
            return &n;
     }

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Sinon, il ne peut pas savoir ce qu'est T.

  6. #6
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ca ne marche pas, ou je m'y prend mal:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T>
    T* A::createPointer(){
                       return &n;
                       }
    De plus cette notation est valide pour les méthodes templates de n'importe quelle classe et donc il me renvoie l'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     28 C:\DOCUME~1\PROPRI~1\Bureau\main_test.cpp `template<class T> class A' used without template parameters 
    C:\DOCUME~1\PROPRI~1\Bureau\main_test.cpp In function `T* createPointer()': 
    29 C:\DOCUME~1\PROPRI~1\Bureau\main_test.cpp `n' undeclared (first use this function)
    Ma méthode n'est pas template, seule ma classe l'est.

  7. #7
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    excuse moi j'avais oublié qqchose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <typename T>
    T* A<T>::createPointer(){
            return &n;
     }

  8. #8
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Excellent, ça marche nickel!
    Merci encore!

    Juste une dernière question:
    pourquoi le compilo n'interprète pas
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T>
    T* A<T>::createPointer()
    comme une définition de méthode template ce qui générerait des erreurs car pas en accord avec la déclaration non template dans la classe?
    Est-ce qui le lui indique?

    Merci de vos lumières.

  9. #9
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693
    Par défaut
    Oui, avec la ligne que tu ajoutes avant tu déclare juste le paramètre template.

    Je crois que pour les méthodes template tu ajoutes

    mais je suis plus sur... ça fait un bail que j'utilise plus les templates.

  10. #10
    Membre éclairé Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Points : 693
    Points
    693

  11. #11
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci de l'explication, je ne savais pas que template<...> permettait de déclarer des paramètres templates utilisables n'importe où dans l'expression qui suit:soit pour la classe, soit la méthode.
    Merci pour le lien.

    Je note le problème .

    Merci encore!

  12. #12
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Bonjour,

    un autre problème : si l'implémentation de la classe "A" est séparée du code qui l'utilise, le "main", le linkage ne passe pas.

    Dans les deux cas l'interface est dans le fichier "A.h" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<typename T = int>
    class A
    {
    	public: void f(void);
    };

    1er scénario :
    L'implémentation + le code de test dans le fichier "main.cpp" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include "A.h"
     
    template<typename T>
    void A<T>::f()
    {
    }
     
    int main(void)
    {
    	A<> a;
    	a.f();
    	return 0;
    }
    Ca compile et link sans problèmes.

    2ème scénario :
    l'implémentation de la classe A est placée dans un autre fichier "A.cpp" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    #include "A.h"
     
    template<typename T>
    void A<T>::f()
    {
    }
    Le "main.cpp" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "A.h"
     
    int main(void)
    {
    	A<> a;
    	a.f();
    	return 0;
    }
    Et là l'erreur suivante se produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    $ g++ main.cpp A.cpp
    /tmp/ccyjtOWe.o: In function `main':
    main.cpp:(.text+0x18): undefined reference to `A<int>::f()'
    collect2: ld returned 1 exit status
    Pourtant l'implémentation et le code du main sont compilés en même temps.

    Ce problème ne se produit pas si la classe "A" n'est pas template.

    Merci de votre aide.

  13. #13
    Alp
    Alp est déconnecté
    Expert éminent sénior

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Points : 11 861
    Points
    11 861
    Par défaut
    A ce sujet, je te conseille de consulter la section Templates de la FAQ C++.

  14. #14
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci, la réponse se trouvait en effet dans la FAQ : http://cpp.developpez.com/faq/cpp/?p...VERS_templates

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

Discussions similaires

  1. Spécialisation de greater pour une classe template
    Par oodini dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2012, 09h31
  2. Réponses: 2
    Dernier message: 01/12/2011, 13h16
  3. Réponses: 1
    Dernier message: 09/04/2010, 11h15
  4. Définition const. & dest. d'une classe template
    Par KuroAkisame dans le forum Langage
    Réponses: 4
    Dernier message: 02/09/2008, 16h26
  5. Réponses: 7
    Dernier message: 22/02/2007, 16h57

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