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 :

problème de type dans les templates - typedef bis


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 problème de type dans les templates - typedef bis
    Bonjour,

    Dans la série explorons le merveilleux pays des templates, je bute sur un souci que je ne sais par quel bout prendre. J'ai, dans un fichier typedef.h, les typedef suivants :

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    template<class TLine> class Node;
    class Line;
    template <class LineType> class ItSegment;
     
    template <class TLine> class NodeWrapper{};
     
    template<> class NodeWrapper<Line>
    {
     public:
      typedef list<Node<Line>*>::iterator iter;
      typedef list<Node<Line>*>::const_iterator c_iter;
      typedef list<Node<Line>*>::iterator& ref_iter;
      typedef list<Node<Line>*>::const_reverse_iterator cr_iter;
      typedef list<Node<Line>*>::const_iterator& ref_c_iter;
      typedef Node<Line> NodeType;
      typedef Node<Line>* pNodeType;
      typedef Node<Line>& rNodeType;
      typedef Line line;
    };
     
     
     
    template<class LineType> class TitSegment
    {};
     
    template<> class TitSegment<Line>
    {
     public:
      typedef ItSegment< Line > iter;
      typedef const ItSegment< Line > c_iter;
      typedef Node<Line> NodeType;
      typedef Node<Line>* pNodeType;
      typedef Node<Line>& rNodeType;
      typedef Line line;
    };
    On définit une classe ItSegment, qui ressemble à ceci (j'oublie les focntions membres, c'est le constructeur copié ici qui pose problème) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template< class LineType > class ItSegment
      {
      public:
        ItSegment(NodeWrapper<LineType>::iter itnode0,
                  NodeWrapper<LineType>::iter itnode1)
        { psegment = new Segment<LineType>(itnode0,itnode1); }
     
      private:
     
       Segment<LineType>* psegment;
    };
    Et la classe Segment ressemble à ceci (pareil, j'ai cutté tout plein de détails) :

    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
    template< class LineType> class Segment
    {
    public:
     
      bool CheckConsistency(typename NodeWrapper<LineType>::line** pline);
      Segment(typename NodeWrapper<LineType>::ref_c_iter itnode0,
              typename NodeWrapper<LineType>::ref_c_iter itnode1)
        :itfirstnode(itnode0),itsecondnode(itnode1)
      {}
    private:
     
      //! iterator to the first node
      typename NodeWrapper<LineType>::iter itfirstnode;
     
      //! iterator to the second node
      typename NodeWrapper<LineType>::iter itsecondnode;
    };
    et j'obtiens à la compilation un superbe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    itsegment.hpp|56| erreur: expected ‘)’ before ‘itnode0’
    si je mets un typename dans les paramètres du constructeur de ItSegment, ça donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    itsegment.hpp|58| erreur: no matching function for call to ‘Segment<Line>::Segment(NodeWrapper<Line>::iter&, NodeWrapper<Line>::iter&)’
    segment.hpp|62| note: candidats sont: Segment<TLine>::Segment(typename NodeWrapper<LineType>::ref_c_iter, typename NodeWrapper<LineType>::ref_c_iter) [with LineType = Line]
    segment.hpp|45| note:                 Segment<Line>::Segment(const Segment<Line>&)
    Si vous avez des suggestions, je suis preneur... je ne comprends pas encore bien le passage des types dans les templates, je dois bien reconnaître...

    Merci beaucoup

    Marc

  2. #2
    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
    Ah ! et la fonction appelante ressemble à ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    TitSegment<Line>::iter Line::GetFirstSegment()
    {
     
      // iterators on the nodes of the first segment
      NodeWrapper<Line>::iter itnode0=_nodes.begin();
      NodeWrapper<Line>::iter itnode1=itnode0;
      ++itnode1;
     
      // create the corresponding ItSegment
      return TitSegment<Line>::iter(itnode0,itnode1);
     
    }

  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
    Bon, après ajout de quelques typename qui devaient manquer, j'en suis au même point : ce passage là ne plaît pas du tout :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
       ItSegment(typename NodeWrapper<LineType>::ref_c_iter itnode0,
                  typename NodeWrapper<LineType>::ref_c_iter itnode1)
        { psegment = new Segment<LineType>(itnode0,itnode1); }
    donne, à l'instanciation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    line.C|264| erreur: no matching function for call to ‘ItSegment<Line>::ItSegment(NodeWrapper<Line>::iter&, NodeWrapper<Line>::iter&)’
    itsegment.hpp|84| note: candidats sont: ItSegment<LineType>::ItSegment(const ItSegment<LineType>&) [with LineType = Line]
    itsegment.hpp|56| note:                 ItSegment<LineType>::ItSegment(typename NodeWrapper<LineType>::ref_c_iter, typename NodeWrapper<LineType>::ref_c_iter) [with LineType = Line]
    Est-ce qu'on ne peut pas utiliser les types définis dans les classes en guise de typedef comme type des paramètres dans les fonctions ?

  4. #4
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Est ce que quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typename NodeWrapper<LineType>::ref_c_iter i = itnode0;
    Compile ?

    Si ce n'est pas le cas alors tu auras la raison, il n'arrive pas à trouver de constructeur pour matcher les paramètre, sinon je ne sais pas. (un code minimal pour tester si tu arrives à en faire un, ca serait pratique)

  5. #5
    screetch
    Invité(e)
    Par défaut
    l'un prend des iterateur
    l'autre des references sur un const_iterateur
    ces deux types ne sont pas compatibles, il faut au moins que le const match
    de plus je ne crois pas que les references soient bienvenues ici. Au mieux elles rendent le code confus, au pire tu vas autoriser la modification de ce sur quoi la reference pointe.
    Je crois (pas sur) que tu voulais utiliser des references const sur des iterateurs, et au lieu de ca tu utilises des references sur des iterateurs const, et c'est pas pareil.

  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
    Salut Screetch,

    Tu as vu juste, merci infiniment !!! :-)

    Marc

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 24/09/2010, 16h41
  2. Problème de Type dans une table liée
    Par tangueros78 dans le forum Access
    Réponses: 19
    Dernier message: 16/03/2006, 10h14
  3. Problème d'affichage dans les textbox
    Par popinenhbourg dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 28/02/2006, 13h09
  4. Problème d'affichage dans les textbox
    Par popinenhbourg dans le forum Balisage (X)HTML et validation W3C
    Réponses: 7
    Dernier message: 28/02/2006, 12h36
  5. [VB.NET] [Débutant] Probléme de variable dans les requettes
    Par Silvia12 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 07/03/2005, 14h13

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