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 :

Template et héritage


Sujet :

Langage C++

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 29
    Par défaut Template et héritage
    Bonjour à tous,

    Je n'arrive pas à trouver d'exemples pour ce que j'aimerais faire en C++, mais que j'arrive à faire en Java et en C#.

    Voici un exemple de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<typename T : public IDetectable>
    class IDetector {
    public:
      virtual ~IDetector(void) {}
     
      virtual vector<T*> find() = 0;
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    class BoxDetector : public IDetector<Box>
    {
    public:
      BoxDetector(void);
      virtual ~BoxDetector(void);
     
      vector<Box*> find() { /* ... */ }
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class IDetectable
    {
    public:
      virtual ~IDetectable(void) {}
    };
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    class Box : public IDetectable
    {
    public:
      Box(void);
      virtual ~Box(void);
    };
    Ce qui me permettrait de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    IDetector<IDetectable>* mDetector = new BoxDetector();
    vector<IDetectable*> mBoxes = mDetector->find();
    Le problème que je rencontre est que "BoxDetector" n'est pas reconnu comme étant "IDetector<IDetectable>". De plus que je crois que "template<class T : public IDetectable>" n'est pas une expression valide en C++ même si cela ne cause pas d'erreur de compilation?

    Ceci ne compile pas car IDetectable n'est pas un nom de type valide:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IDetector<IDetectable>* detector;
    Je code dans Visual Studio et je n'utilise aucune libraire comme BOOST etc.

    Merci!

  2. #2
    Membre expérimenté
    Homme Profil pro
    Analyse système
    Inscrit en
    Novembre 2008
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Analyse système
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Novembre 2008
    Messages : 227
    Par défaut
    Dans ton héritage tu as spécialisé ta template avec BOX.
    BoxDetector peut être stocké dans un pointeur de type IDetector<Box>.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 29
    Par défaut
    Mais BOX hérite de IDetectable, alors ça devrait etre possible de dire que :

    BoxDetector peut être stocké dans un pointeur IDetector<Box> ou IDetector<IDetectable> ?

  4. #4
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    IDetector<Box> *ptr = new BoxDetector();         // compile
    IDetector<IDetectable> *ptr = new BoxDetector(); // ne compile pas
    error: cannot convert ‘IDetector<Box>*’ to ‘IDetector<IDetectable>*’ in initialization
    Pour les paramètres template, il n'y a pas d'héritage qui tienne.
    Il faut qu'ils soient du bon type (ou de la bonne valeur) pour que ça fonctionne.
    C'est le seul moyen qu'a le compilateur de déterminer quelle est la fonction/classe à instancier.

    [edit]
    On peut utiliser des expressions au niveau des paramètres template qui retournent différentes valeurs, mais je ne sais pas exactement comment ça fonctionne.
    Ça peut peut-être t'aider.
    C'est utilisé dans les « concept check », et même au niveau des conteneurs de la STL, donc si tu vas examiner le code source…
    [/edit]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 29
    Par défaut
    Tu as effectivement bien cerné mon problème. J'en conclue que je ne peux utiliser l'héritage dans les templates comme il est possible de le faire avec les Generics en Java et C#.

    [edit]
    Cependant, est-t-il envisageable de faire un cast pour le "convertir" au type supérieur?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    BoxDetector* box = new BoxDetector();
    box->setMinWidth(10);
    box->setMinHeight(10);
     
    vector<IDetector<IDetectable>*> list;
    list.push_back((IDetector<IDetectable>*)box);
    [/edit]

  6. #6
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par JeePI196 Voir le message
    J'en conclue que je ne peux utiliser l'héritage dans les templates comme il est possible de le faire avec les Generics en Java et C#.
    C'est exactement ça, malheureusement.
    Il y a probablement moyen de faire autrement, mais je ne suis pas assez calé pour te dire comment…

  7. #7
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    non, le probleme est que meme si A hérite de B, C<A> n'a aucun lien avec C<B>.

    Reste donc a ajouter manuellement l'héritage dans Box.

    Les concepts checks ne servent qu'a verifier ce genre de relation, pas a les implanter.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 29
    Par défaut
    Merci de l'information, topic résolu malgré tout.

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

Discussions similaires

  1. Template et héritage
    Par Ulmo dans le forum Langage
    Réponses: 16
    Dernier message: 08/03/2009, 23h41
  2. Template et héritage
    Par rooger dans le forum Langage
    Réponses: 5
    Dernier message: 22/07/2008, 13h48
  3. Foncteur, classes templates et héritage
    Par Floréal dans le forum C++
    Réponses: 8
    Dernier message: 17/06/2007, 21h56
  4. Template ou héritage
    Par bolhrak dans le forum Langage
    Réponses: 6
    Dernier message: 22/12/2006, 11h22
  5. patron, templates et héritages!
    Par kleenex dans le forum C++
    Réponses: 4
    Dernier message: 05/06/2006, 22h57

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