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:
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:
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:
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:
itsegment.hpp|56| erreur: expected ) before itnode0
si je mets un typename dans les paramètres du constructeur de ItSegment, ça donne :
Code:
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