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 :

Problème de l'héritage d'une fonction template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut Problème de l'héritage d'une fonction template
    Bonjour,

    je cherche un moyen de contourner l'impossibilité d'hériter d'un fonction membre template, quelqu'un a une idée?

    Un peu de détails. Je voudrais faire ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct Father
    {
       template <typename T>
       virtual void bar( const T & param ) = 0;
    };
     
    struct Son: public Father
    {
       template <typename T>
       void bar( const T & param ) { param.DoSomething(); }
    };
    Evidemment ça ne compile pas parce qu'une fonction membre template ne peut pas être virtuelle (encore moins virtuelle pure donc).

    Connaissez-vous des astuces pour contourner cette limitation?

  2. #2
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Bonjour,

    Pour imaginer une solution de contournement, il faudrait que tu dises ce que tu veux faire avec ces deux (ou plus classe) ? Dans quel contexte te sert cet héritage, pourquoi y-a-t'il un besoin de template dans ce contexte ?

  3. #3
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    En fait, c'est plus un problème théorique, général.
    Je suis tombé sur ce problème concrètement dans un programme que sur lequel je travaille, et j'ai trouvé une solution simple (j'ai juste pas déclaré les fonctions dans la classe de base) et qui convient pour les besoins précis de cette appli. Mais je réfléchissais à une solution plus générique.
    Déjà, je ne comprend pas le pourquoi de cette limitation. Qu'est-ce qui empêche le compilateur de mettre une fonction template dans la vtable?

  4. #4
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    Il faut bien voir qu'une fonction template n'a aucune réalité une fois la compilation passée, ce sont ces instanciations qui en ont une. D'où la problématique, je mets quoi comme instanciation dans la table ? La compilation se fait unité par unité puis ensuite l'ensemble est lié. Chaque unité pourrait déterminer ce qu'il a besoin de mettre dans la table, mais rien ne garantirait à l'éditeur de lien que le contenu de la table serait identique entre chaque unité.

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Je ne comprends pas. Une fonction template n'a, qu'elle soit virtuelle ou non, de réalité qu'à l'instanciation. Je ne comprend donc pas ce que ça change qu'elle soit virtuelle

  6. #6
    Membre Expert

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Par défaut
    On va faire simple, disons que j'ai cette classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct A
    {
      template<class>
      virtual void foo(){}
    };
    Maintenant j'ai deux fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    //B.cpp
    void bar(A& a)
    { a.foo<char>(); }
     
    //C.cpp
    void goo()
    { 
      A a;
      a.foo<int>();
      bar(a);
    }
    Après compilation, j'ai un truc (juste dans l'idée) du genre :
    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
     
    //B.obj
    foo_char(a)
    { a.table[0](a); }
     
    bar(a)
    { foo_char(a); }
     
    //C.obj
    foo_int(a)
    { a.table[0](a); }
     
    goo()
    {
      a; a.table[0] = foo_int;
      foo_int(a);
      bar(a);
    }
    L'éditeur de liens met tout ensemble, pas de problème, sauf qu'on se retrouve à appeler deux fois foo<int>à la place de foo<int> puis foo<char> dans goo(). Et le compilateur ne peut pas faire autrement, il n'y a qu'une instance dans chaque fichier, donc il considère une table a un seul élément.

Discussions similaires

  1. aidee :problème héritage d une fonction
    Par mitnick2006 dans le forum C++
    Réponses: 8
    Dernier message: 02/06/2007, 22h16
  2. Réponses: 2
    Dernier message: 29/03/2007, 12h02
  3. Problème pour la création d'une fonction
    Par jipé95 dans le forum C
    Réponses: 5
    Dernier message: 10/12/2006, 14h28
  4. problème avec l'appel d'une fonction
    Par mademoizel dans le forum ASP
    Réponses: 5
    Dernier message: 26/06/2006, 15h04
  5. Pointeur sur une fonction template
    Par Progs dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2006, 20h25

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