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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    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 Expert

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

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

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

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    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 éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    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 éclairé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    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

+ 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