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 :

pure virtual method et templated return type


Sujet :

Langage C++

  1. #1
    Invité
    Invité(e)
    Par défaut pure virtual method et templated return type
    hello,

    ce code compile:
    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
    template<class T>
    class A{
    public:
      typedef A<T> type;
      virtual void operator*(type&)=0;
    };
    class El:public A<int>{
    public:
      void operator*(type&){
      }
    };
    int main(){
      El e;
      return 0;
    }
    noter l'instanciation de El, et le return type==void

    mais le code suivant ne compile pas:
    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
     
    template<class T>
    class A{
    public:
      typedef A<T> type;
      virtual void operator*(type&)=0;
    };
    class El:public A<int>{
    public:
      void operator*(type&){
        type e;
      }
    };
    int main(){
      El e;
      return 0;
    }
     
     
    main.cpp:10:8: erreur: conflicting return type specified forvirtual void El::operator*(A<int>::type&)’
    main.cpp:6:16: erreur:   overriding ‘A<T>::type A<T>::operator*(A<T>::type&) [with T = int, A<T>::type = A<int>]’
    main.cpp: In member function ‘virtual void El::operator*(A<int>::type&)’:
    main.cpp:11:10: erreur: cannot declare variable ‘e’ to be of abstract type ‘A<int>’
    main.cpp:3:7: note:   because the following virtual functions are pure within ‘A<int>’:
    main.cpp:6:16: note: 	A<T>::type A<T>::operator*(A<T>::type&) [with T = int, A<T>::type = A<int>]
    make: *** [matrix.o] Erreur 1
    pourquoi?
    (noter l'instantiation de El au sein de El::operator*)

  2. #2
    Invité
    Invité(e)
    Par défaut
    suis-je bete...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      void operator*(type&){
        type e; //type est abstrait, devrait utiliser El e;
      }
    puis si on change la signature
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type El::operator*(type&)
    on ne pourra pas non plus retourner quoique ce soit puisque type est abstrait.

    il suffit donc d'utiliser
    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
     
    template<class Sub>
    class A{
    public:
      typedef Sub type;
      virtual Sub operator*(Sub&)=0;
    };
    class El:public A<El>{
    public:
      type operator*(type&){
        El e;
        return e;
      }
    };
    int main(){
      El e,f;
      El g=e*f;
      return 0;
    }
    ce qui est assez surprenant (voir que El:A<El> j'aurais pensé que pour définir El, il faut définit A<El> donc...infinite loop mais bon, c'est agréable )

  3. #3
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour

    A<T> est une classe qui a une fonction membre virtual pure et donc, tu ne peux pas l'instancier.

    Il faut que tu laisses virtual mais que tu enlèves = 0; :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual void operator *(type &);
    Edit : Et « ne surtout pas oublier de l'implémenter ».

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bonjour Ehonn, oui on s'est croisé

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Points : 1 211
    Points
    1 211
    Par défaut
    Citation Envoyé par Ehonn Voir le message
    Il faut que tu laisses virtual mais que tu enlèves = 0; :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    virtual void operator *(type &);
    Et surtout l'implémenter pour éviter une erreur de linkage.

  6. #6
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    ...
    C'était la déclaration là. En plus n'importe quel compilateur va faire un message d'erreur relativement clair (si tu essayes de l'appeler, sinon, ça peut être moins clair).
    (J'ai quand même édité mon message)

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 17/05/2007, 16h47
  2. Template et type
    Par olivier1978 dans le forum Langage
    Réponses: 7
    Dernier message: 12/02/2007, 00h55
  3. The return type is incompatible with..
    Par lr dans le forum Langage
    Réponses: 6
    Dernier message: 12/11/2006, 22h29
  4. Templates et Types.
    Par ousta dans le forum C++
    Réponses: 4
    Dernier message: 30/11/2005, 20h14

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