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