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 :

héritage et template STL


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut héritage et template STL
    Je voudrai hériter d'un conteneur map afin de redéfinir la fonction erase.

    Voici mon code :

    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
    template <class Key, class Data> class lomap &#58; public map<Key, Data> &#123;
    public&#58;
      lomap&#40;&#41;;
      ~lomap&#40;&#41;;
      map<Key, Data>&#58;&#58;iterator erase&#40;map<Key, Data>&#58;&#58;iterator&#41;; // erreur &#58; expected ';' before 'erase'
    &#125;;
     
    template <class Key, class Data> lomap<Key, Data>&#58;&#58;lomap&#40;&#41;&#58;map<Key, Data>&#40;&#41;&#123;&#125;
     
    template <class Key, class Data> lomap<Key, Data>&#58;&#58;~lomap&#40;&#41;&#123;&#125;
     
    template <class Key, class Data> map<Key, Data>&#58;&#58;iterator lomap<Key, Data>&#58;&#58;erase&#40;map<Key, Data>&#58;&#58;iterator it&#41;&#123;
      map<Key, Data>&#58;&#58;iterator it_svg;
      it_svg=it;
      ++it_svg;
      map&#58;&#58;erase&#40;it&#41;;
      return it_svg;
    &#125;
    L'erreur est écrite en commentaire, mais je ne parviens pas à comprendre.
    Merci pour votre aide, Laurent.

    [ Balises [CODE] ajoutées par BigBoomShakala. Pensez à les utiliser, merci ]

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    A l'intérieur de ton template, pense à ajouter le mot-clé "typename" devant tout ce qui est un type.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typename map<Key, Data>&#58;&#58;iterator erase&#40;typename map<Key, Data>&#58;&#58;iterator&#41;;
    C'est traité dans la FAQ C++.

  3. #3
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Tu ne peux pas redéfinir erase. Ne cherche pas, c'est impossible. Tout ce que tu peux faire c'est la masquer au sein de la classe fille. Et bien sûr, destructeur et clear continuront à appeler l'erase de la classe mère. Ce qui n'est probablement pas ce que tu veux.

    Le conteneurs de la SL ne sont pas conçus pour être dérivés publiquement (et donc respecter le LSP (recherche avancée/google!)). Si tu cherches à redéfinir erase (ce qui est impossible), ta classe fille ne peut pas "être-une" représentante de la classe mère.
    A la limite, orientes-toi vers l'héritage privé (qui est un pur héritage de réutilisation de code), change ce qui doit l'être dans l'interface et recharge (avec using) les définitions qui peuvent être ré-exportées telles quelles. La composition est une autre alternative.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Merci pour votre aide !
    En fait, je ne cherche pas à redéfinir erase mais à en définir un nouveau (avec une nouvelle signature) :
    typename map<Key, Data>::iterator erase(typename map<Key, Data>::iterator);

    En fait, c'est pour porter du code écrit sous Windows, la version STL de Microsoft possède cette fonction erase qui n'existe pas dans la librairie standard ...

  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 : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    En fait, je ne cherche pas à redéfinir erase mais à en définir un nouveau (avec une nouvelle signature) :
    typename map<Key, Data>::iterator erase(typename map<Key, Data>::iterator);
    Il faudra tout de même recharger les autres erase (avec using), sinon tu vas les masquer.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 3
    Points : 2
    Points
    2
    Par défaut
    Ok, merci !
    Voici le code final qui compile et semble fonctionner :

    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
    #include <map>
     
    using namespace std;
     
    template < typename Key, typename Data, typename Compare=less< Key > > 
    class lomap &#58; public map < Key, Data, Compare > &#123;
    public&#58;
      lomap&#40;&#41;;
      ~lomap&#40;&#41;;
      typename map<Key, Data, Compare>&#58;&#58;iterator erase&#40;typename map<Key, Data, Compare>&#58;&#58;iterator&#41;;
      using map<Key, Data, Compare>&#58;&#58;erase;
    &#125;;
     
    template < typename Key, typename Data, typename Compare > lomap<Key, Data, Compare>&#58;&#58;lomap&#40;&#41;&#58;map<Key, Data>&#40;&#41;&#123;&#125;
     
    template < typename Key, typename Data, typename Compare > lomap<Key, Data, Compare>&#58;&#58;~lomap&#40;&#41;&#123;&#125;
     
    template < typename Key, typename Data, typename Compare> typename map < Key, Data, Compare >&#58;&#58;iterator 
    lomap < Key, Data, Compare >&#58;&#58;erase&#40;typename map < Key, Data, Compare >&#58;&#58;iterator it&#41;&#123;
      typename map < Key, Data, Compare >&#58;&#58;iterator it_svg=it;
      ++it_svg;
      map < Key, Data, Compare >&#58;&#58;erase&#40;it&#41;;
      return it_svg;
    &#125;
    Pas très léger en syntaxe !

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

Discussions similaires

  1. "Héritage" ou "Template de table"
    Par mr_yvele dans le forum PowerAMC
    Réponses: 1
    Dernier message: 13/09/2007, 18h45
  2. Héritage classe template->classe template
    Par zabibof dans le forum Langage
    Réponses: 5
    Dernier message: 11/08/2007, 12h05
  3. Réponses: 16
    Dernier message: 17/03/2007, 18h31
  4. Héritage et Templates
    Par rulianf dans le forum C++
    Réponses: 5
    Dernier message: 26/10/2005, 18h09
  5. Réponses: 13
    Dernier message: 03/10/2005, 19h06

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