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

C++ Discussion :

typedef imbriqués (?) et templates


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut typedef imbriqués (?) et templates
    Bonjour,

    Une drôle d'idée vient de nous arriver : nous templatisons, et les petits amateurs que nous sommes se retrouvent à devoir redéfinir des typedef histoire d'essayer de sauver des lignes illisibles. Dans l'ancienne version, les typedef qui posent problèmes ressemblaient à ceux-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    //classe ItSegment
    template<class TNodeIterator> class ItSegment;
    //typedef pour la classe TitNode :
    typedef list<Node*>::iterator TitNode;
    //typedef pour la classe TitSegment
    typedef ItSegment<TitNode> TitSegment;
    Mais maintenant, la classe Node est elle-même un template, donc on essaye d'écrire des choses comme celle-là :
    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
     
    //classe ItSegment
    template<class TLine,template<class TLine> class TNodeIterator > class ItSegment;
    //typedef pour la classe TitNode :
    template <class TLine> class TitNode{};
    //spécialisé pour la classe Line
    template<> class TitNode<Line>
    {
     public:
      typedef list<Node<Line>*>::iterator Type;
    };
    //typedef pour la classe TitSegment
    template<class TLine> class TitSegment
    {};
    //spécialisé pour la classe Line
    template<> class TitSegment<Line>
    {
     public:
      typedef ItSegment<Line,list<Node<Line>*> >::iterator Type;
    };
    et ça ça nous pète au nez... avec des messages du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    erreur: type/value mismatch at argument 2 in template parameter list fortemplate<class TLine, template<class TLine> classTNodeIterator> struct ItSegment’
    Toute suggestion sera la bienvenue ;-)

    Merci tout plein !

    Marc

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,

    Problème classique... voir la faq :
    A quoi sert le mot-clé typename ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Bonjour,

    Merci pour la réponse ! Mais ça ne plaît pas à mon compilo, si j'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    template<class TLine> class TcitNode{};
     
    template<> class TcitNode<Line>
    {
     public:
      typedef typename list<Node<Line>*>::const_iterator Type;
    };
    Il me répond :
    erreur: using ‘typename’ outside of template
    Je dois avouer que je maitrise encore (très) mal le mot clef typename... parmi d'autres ;-)

  4. #4
    screetch
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<class TLine,template<class TLine> class TNodeIterator > class ItSegment;
    //ItSegment attend ici une classe et une classe template
    typedef ItSegment<Line,list<Node<Line>*> >::iterator Type;
    //ItSegment recoit ici une classe et une classe deja specialisée
    je crois que le probleme est dans ta declaration, tu veux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<class TLine, class TNodeIterator > class ItSegment;
    Il y a aussi une confusion avec ce qui est un iterateur
    apparemment ItSegment demande un iterateur pour son second parametre, mais ItSegment est aussi un iterateur lui meme?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    ItSegment est une classe maison qui sert d'itérateur sur une classe Segment (Segment qui est composée de Node(s), sur lesquels on itère avec un itérateur de Node : bien imbriqué, ce bazard, hein ?), d'où le besoin de transférer à ItSegment le bon type d'ItSegment sur les Nodes.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Pour préciser un peu les choses, ci-dessous un constructeur de ItSegment dans la version où Node n'est pas templatisé, et donc pas de problème pour faire passer le type TNodeIterator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<class TNodeIterator> class ItSegment
      {
      public:
     
        ItSegment(const TNodeIterator& itnode0,
                  const TNodeIterator& itnode1)
        { psegment = new Segment<TNodeIterator>(itnode0,itnode1); }
    }
    Mais maintenant, Node étant templatisé, ItSegment s'écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template<class TLine,template<class TLine> class TNodeIterator > class ItSegment
    et on aimerait bien faire un typedef - ou ce qui en tient lieu - pour éviter à nos chers utilisateurs de trop se prendre la tête... et à nous aussi par la même occasion.

    Merci pour vos interventions

  7. #7
    screetch
    Invité(e)
    Par défaut
    si Node est templatisé, ca ne veut pas dire que ItSegment doit devenir imbuvable

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template<class TNodeIterator> class ItSegment
      {
      public:
     
        ItSegment(const TNodeIterator& itnode0,
                  const TNodeIterator& itnode1)
        { psegment = new Segment<TNodeIterator>(itnode0,itnode1); }
    }
    marchera meme si ton TNodeIterator est issu d'une classe template

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    OK, je commence à croire que ce que l'on cherche à faire est impossible. Le but du jeu est de faire passer comme paramètre de la classe template ItSegment un itérateur d'une autre classe template, (ItNode<Line>::Type, ou bien ItNode<FaultedLine>::Type, par exemple) ça me paraît mal barré... est-ce que c'est théoriquement possible ?

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Merci pour ta réponse Screetch,

    Le souci étant qu'on a besoin du type de Node dans la classe ItSegment, pour créer des objets Segment, genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        ItSegment(const ItSegment& itsegment)
        {
          psegment = new Segment<TLine,TNodeIterator>(itsegment->GetFirstNode(),
                                                      itsegment->GetSecondNode());
        }

  10. #10
    screetch
    Invité(e)
    Par défaut
    c'est Segment qui en a besoin, pas ItSegment.Ensuite, les TNodeIterator peuvent definir ce type au besoin, et tu peux le retrouver via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TNodeIterator::element_type
    si TNodeIterator est un iterateur de la STL, ce sur quoi il pointe est automatiquement ajouté dans iterator:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list<Node*>::iterator::value_type //est un alias pour Node*

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Bonjour,

    Merci à tous pour vos réponse : ça me donne des choses à potasser !! J'ai une petite question dans le prolongement : est-ce qu'on peut imaginer d'écrire des choses comme celle-ci (plus pour savoir si je comprends quelque chose à ce que je lis :

    value_type::value_type

    pour accéder au type d'une classe enterrée sous deux couches de template ?

    Merci encore !!

    Marc

  12. #12
    screetch
    Invité(e)
    Par défaut
    ca depend du premier value_type
    disons que ta classe se comporte comme un container contenant des alias vers d'autre types, des liens symboliques, des pointeurs, je ne sais pas ce avec quoi tu es le plus familier

    donc list<Node> contient un "lien symbolique" qui pointe sur Node, lequel pourrait contenir un lien symbolique a son tour vers d'autres types. Cela te permet a partir de list<Node> (ou de list<Node>::iterator) de retrouver non seulement Node, mais peut etre Segment ou n'importe.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    OK, merci beaucoup Screetch !! Je commence à prendre goût à ce genre de trucs

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Ca y est, problème résolu, grâce à vous ! Un grand merci

    A bientôt

    Marc

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

Discussions similaires

  1. typedef et variadic template
    Par victor_gasgas dans le forum Langage
    Réponses: 7
    Dernier message: 03/11/2011, 17h55
  2. typedef imbriqués - comment faire ?
    Par TomTom68 dans le forum C
    Réponses: 7
    Dernier message: 03/09/2011, 19h37
  3. [C++] typedef dans des template
    Par inh40 dans le forum Langage
    Réponses: 1
    Dernier message: 10/12/2007, 17h59
  4. Typedef sur fonction template
    Par mchk0123 dans le forum Langage
    Réponses: 7
    Dernier message: 01/04/2007, 15h07
  5. Réponses: 5
    Dernier message: 17/06/2005, 19h26

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