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 :

Méthode template virtuelle


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Par défaut Méthode template virtuelle
    Bonjour
    Comme indiqué dans le titre je cherche a faire des méthodes virtuelles utilisant des templates.
    voici mon code actuel

    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
     
    class Visiteur {
     
    	public:
    		Visiteur();
     
    		~Visiteur();
     
    		template <class Retour, class Param>
    		Retour visite(Classe * n, const Param & p)=0;
    		template <class Retour, class Param>
    		Retour visite(Ident * n, const Param & p)=0;
    		template <class Retour, class Param>
    		Retour visite(Decls * n, const Param & p)=0;
    		template <class Retour, class Param>
    		Retour visite(Main * n, const Param & p)=0;
     
    };
     
    class ControleDeType : public Visiteur{
        private:
            int nbErreurs;
            int* tabErreurs;
     
    	public:
    		ControleDeType();
     
    		~ControleDeType();
     
                    template <class Retour, class Param>
    		Retour visite(Classe * n, const Param & p);
    		template <class Retour, class Param>
    		Retour visite(Ident * n, const Param & p);
    		template <class Retour, class Param>
    		Retour visite(Decls * n, const Param & p);
    		template <class Retour, class Param>
    		Retour visite(Main * n, const Param & p);
     
     
    };
    La compilation de ce code fonctionne mais lorsque je rajoute l'appel a une méthode le code ne compile plus.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Visiteur * c;
    c = new ControleDeType();
    Classe * classe = new Classe();
    c->visite<int, int>(classe, 0);
    l'erreur est la suivante :
    [Linker error] undefined reference to `int Visiteur::visite<int, int>(Classe*, int const&)'

    Je ne sais pas très bien utiliser les templates, et je n'arrive pas a voir d'ou viens cette erreur.
    Si quelqu'un pouvait me dépanner ce serait sympa.

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Une fonction template ne peut pas être virtuelle, c'est dans la norme. La raison est simple : un template n'est pas une fonction, mais un modèle, qui correspondra potentiellement à plein de fonctions différentes.

  3. #3
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Par défaut
    Merci pour ta réponse.

    Puisque je ne peux pas utiliser les templates je vais poser mon problème de départ :
    J'ai une structure d'arbre avec des pointeurs sur des noeuds.
    j'ai différents types de noeuds qui hérites tous de la classe noeuds.

    Je voudrais pouvoir réaliser des méthode sur ces types de noeuds mais que ces méthodes soient dans un même fichier différents de celui des noeuds.

    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
    class Noeud{
     
    	protected:
    		Noeud** listeFils;
    		int nbFils;
     
    	public:
    		Noeud(int nb);
     
    		virtual ~Noeud();
    };
     
    class Classe : public Noeud{
    	public:
    		Classe(Noeud* fils0,Noeud* fils1,Noeud* fils2);
     
    		~Classe();
    };
    Je voudrais pouvoir définir une méthode controledetype pour chaque type de noeuds qui serait definit dans un autre fichier.
    Les fils de chaque noeuds sont des pointeur sur noeuds, et l'exécution de la méthode controledetype sur un fils doit bien evidement s'exécuter en fonction du type de noeud du fils.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Noeud* n;
    n = new Classe(n0, n1, n2);
    n->controledetype();
    Ce code doit faire appel a la méthode controledetype définit dans classe et pas dans noeud.

  4. #4
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Dans ton code, il n'y a pas de fonction virtuelle, donc ça devrait marcher. D'après ton message d'erreur, je soupçonne un autre problème, celui décrit dans :
    http://c.developpez.com/faq/cpp/?pag...VERS_templates
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  5. #5
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Dans ton code, il n'y a pas de fonction virtuelle, donc ça devrait marcher
    Tiens oui, j'avais même pas fait gaffe. Par contre il y a tout de même les "= 0", c'est normal que ça passe ça ?

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Effectivement, le =0 ici, est problèmatique. Celui là, c'est moi qui ne l'avais pas vu...
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Candidat au Club
    Inscrit en
    Novembre 2005
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 3
    Par défaut
    Il n'y a pas de virtual car justement quand j'en mais ca compile plus
    (logique si les fonction template ne peuvent pas être vituelles)

    Je vais donc essayé de résoudre le problème autrement.
    Merci

Discussions similaires

  1. Méthode template intelligente
    Par Takahani dans le forum Langage
    Réponses: 17
    Dernier message: 08/02/2008, 19h57
  2. Méthode template : déclaration/définition et appel ?
    Par kidpaddle2 dans le forum Langage
    Réponses: 3
    Dernier message: 22/04/2007, 14h09
  3. Méthode template dans classe non template ?
    Par shenron666 dans le forum Langage
    Réponses: 12
    Dernier message: 04/09/2006, 17h50
  4. Appeler une méthode template d'un paramètre template
    Par YéTeeh dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2006, 12h50
  5. Fonction template virtuelle... comment l'éviter ?
    Par :Bronsky: dans le forum Langage
    Réponses: 12
    Dernier message: 07/06/2005, 14h21

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