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 :

Fonction template et classe virtuelle


Sujet :

Langage C++

  1. #1
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut Fonction template et classe virtuelle
    Bonjour à tous,

    J'essaye de résoudre une erreur de compilation du type cannot declare variable to be of abstract type.

    Le design de l'application est simple, il s'agit d'une classe virtuelle qui hérite d'une classe virtuelle pure :

    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 A
    {
      virtual void fonction1() = 0;
    };
     
    class B : public virtual A
    {
      B(int x, int y);
      virtual void fonction1();
    };
     
    B::B(int x, int y)
    { blabla }
     
    void B::fonction1(){
    //blabla
    }
    Jusque là, tout fonctionne bien. Mais ça se corse lorsque j'implémente une nouvelle fonction template de ce type (dans un fichier à part) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template <typename X>
    void ma_fonction( int valeur)
    {
      // Et quelque part
      X variable(valeur, another_valeur); 
    }
     
    // Appel de la fonction dans le main ;
     
    ma_fonction<B>(2);
    Quelle est le problème ?

    Merci d'avance.

  2. #2
    Membre habitué
    Profil pro
    Dev
    Inscrit en
    Mai 2009
    Messages
    257
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Mai 2009
    Messages : 257
    Points : 190
    Points
    190
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Bonjour à tous,

    J'essaye de résoudre une erreur de compilation du type cannot declare variable to be of abstract type.

    Le design de l'application est simple, il s'agit d'une classe virtuelle qui hérite d'une classe virtuelle pure :

    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 A
    {
      virtual void fonction1() = 0;
    };
     
    class B : public virtual A
    {
      B(int x, int y);
      virtual void fonction1();
    };
     
    B::B(int x, int y)
    { blabla }
     
    void B::fonction1(){
    //blabla
    }
    Jusque là, tout fonctionne bien. Mais ça se corse lorsque j'implémente une nouvelle fonction template de ce type (dans un fichier à part) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    template <typename X>
    void ma_fonction( int valeur)
    {
      // Et quelque part
      X variable(valeur, another_valeur); 
    }
     
    // Appel de la fonction dans le main ;
     
    ma_fonction<B>(2);
    Quelle est le problème ?

    Merci d'avance.
    cette fonction est-elle virtuelle ? parce qu'il faut savoir qu'une fonction membre virtuelle ne peut pas être template .

  3. #3
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    La fonction ma_fonction est totalement indépendante de toute structure. C'est une fonction template déclarée dans un fichier .hpp.

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Citation Envoyé par coda_blank Voir le message
    cette fonction est-elle virtuelle ? parce qu'il faut savoir qu'une fonction membre virtuelle ne peut pas être template .
    Elle ne peut pas être virtuelle, puisqu'elle n'est pas membre.

  5. #5
    En attente de confirmation mail

    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 : 33
    Localisation : France, Doubs (Franche Comté)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    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
     
    struct A
    { virtual void fonction1() = 0; };
     
    struct B : virtual A
    {
    	B(int, int) {}
    	virtual void fonction1()
    	{}
    };
     
    template <typename X>
    void ma_fonction( int valeur)
    {
    	X variable(valeur, 0);
    	variable.fonction1();
    }
     
    int main()
    { ma_fonction<B>(2); }
    Compile correctement (avec un destructeur virtuelle ca serait mieux mais c'est autre chose).

    Ton problème vient d'ailleurs (j'ai corrigé l'accessibilité dans ton code).

    Montres un code minimal reproduisant le problème, en un seul "fichier" si possible.

  6. #6
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Merci pour l'aide. En voulant créer le fichier minimaliste, je me suis rendu compte que ma classe virtuelle pure n'avait plus les mêmes en-têtes de fonction que la classes d'implémentation... (un unsigned int à la place d'un size_t..).

    Bonne soirée.

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 07/10/2013, 21h56
  2. Syntaxe fonction template dans classe template
    Par Aleph69 dans le forum C++
    Réponses: 6
    Dernier message: 15/07/2011, 15h32
  3. Réponses: 4
    Dernier message: 15/10/2008, 09h33
  4. Réponses: 3
    Dernier message: 08/07/2008, 15h06
  5. Fonction template et classe exportée
    Par xwindoo dans le forum Langage
    Réponses: 35
    Dernier message: 11/01/2008, 21h28

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