Salut à tous,

Je me suis plongé dans la lecture du (très bon) bouquin d'Alexandrescu, et j'essaie d'implémenter une classe template dont l'un des paramètres est une politique.
Bon, je suis arrivé à un truc comme ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
template < class ObjectNeighborhoodPolicy,
		   class NodesContainer = boost::vecS,
		   class EdgesContainer = boost::vecS,
		   class Node = MPPRectangleGraphNode,
		   class Edges = Weight
		 > class MPPRectangleGraph  : public BGL_Graph<NodesContainer,EdgesContainer,boost::undirectedS,Node,Edges>, public ObjectNeighborhoodPolicy
Après, ce ne sont encore que des tests. J'ai donc ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
template <class T> class truc
{
	T machin;
};
et à l'instanciation, ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
MPPRectangleGraph< truc<MPPRectangleGraphNode> > g;
Alexandrescu donne une méthode pour éviter la déclaration du paramètre template de la politique à l'instanciation (pas que pour ça ...). C'est à dire qu'on a ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
template < template <class AreNeigh> class ObjectNeighborhoodPolicy,
		   class NodesContainer = boost::vecS,
		   class EdgesContainer = boost::vecS,
		   class Node = MPPRectangleGraphNode,
		   class Edges = Weight
		 > class MPPRectangleGraph  : public BGL_Graph<NodesContainer,EdgesContainer,boost::undirectedS,Node,Edges>, public ObjectNeighborhoodPolicy<LeTemplate>
Et qu'on l'instancie plus simplement :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
MPPRectangleGraph< truc > g;
Or, dans mon cas, "LeTemplate", c'est mon paramètre qui est déjà template, à savoir "Node".
Pour le code des méthodes, je faisai ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
template < class ObjectNeighborhoodPolicy ,class NodesContainer,
		   class EdgesContainer,
		   class Node,
		   class Edges> void MPPRectangleGraph<ObjectNeighborhoodPolicy,NodesContainer,EdgesContainer,Node,Edges>::InitDisplayXML( const std::string &XMLfilename )
		   {//...}
Si j'utilise le "truc" d'Alexandrescu, comment je dois faire ? Visual(2003) hurle ...

Si je fais ça :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
template < template <class AN> class ObjectNeighborhoodPolicy,
		   class NodesContainer = boost::vecS,
		   class EdgesContainer = boost::vecS,
		   class Node = MPPRectangleGraphNode,
		   class Edges = Weight
		 > class MPPRectangleGraph  : public BGL_Graph<NodesContainer,EdgesContainer,boost::undirectedS,Node,Edges>, public ObjectNeighborhoodPolicy<NodesContainer>
Comment je déclare mes méthodes ?