Salut à tous,
J'ai un problème pour déclarer une classe template. Ca, ça marche :

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
template < template <class ONP> class ObjectNeighborhoodPolicy = RectangleIntersectionNeighborhoodPolicy,
		   class Nodes = Node_RectangleBiCircNeighborhoodProfiles,
		   class Edges = Weight,
		   class NodesContainer = boost::vecS,
		   class EdgesContainer = boost::vecS
		 > class MPP_Graph  : public BGL_Graph<NodesContainer,EdgesContainer,boost::undirectedS,Nodes,Edges>,
							  public ObjectNeighborhoodPolicy<Nodes>
{
public:
	/// Constructeur à partir d'un objet contenant les paramètres de l'algorithme et de l'affichage
	/// @param parameters Les paramètres de l'algorithme et de l'affichage
	MPP_Graph( const MPPParameters &parameters );
	/// Destructeur
	~MPP_Graph() {};
	/**
        * @name Méthodes pour l'affichage et sa gestion
        */
	/*@{*/
	/// Initialisation de l'affichage
	/// @param name Le nom de la fenêtre
	/// @param width La largeur de la fenêtre
	/// @param height La hauteur de la fenêtre
	void InitDisplay(std::string name = "MPP",
		unsigned int width = 200,
		unsigned int height = 200);
	/// Initialisation de l'affichage à partir d'un fichier XML
	/// @param XMLfilename Le nom du fichier XML
	void InitDisplayXML( const std::string &XMLfilename );
	/// Affichage de la fenêtre et de ses différents éléments (encapsule la méthode Draw)
	/// @param flags Flags pour le choix de ce qu'il faut afficher
	/// \sa GraphDraw
	void Display( unsigned int flags = GraphDraw::eDRAW_ALL );
	/*@}*/
 
	/// Affichage du graphe
	/// @param flags Flags pour le choix de ce qu'il faut afficher
	/// \sa GraphDraw
	void Draw( unsigned int flags = GraphDraw::eDRAW_ALL);
 
	/// Calcul des voisinages dans le graphe
	void ComputeNeighborhoods();
 
protected:
	/// Les différents paramètres associés à l'algorithme et à l'affichage
	MPPParameters MPPParameters_;
	/// Flag indiquant si l'affichage a été initialisé
	bool is_display_init_;
	/// La fenêtre d'affichage du graphe
	IdFenetreCalques window_;
	/// Le calque contenant les rectangles
	IdCalqueVecteur layer_rectangle_;
	/// Le calque contenant les profiles
	IdCalqueVecteur layer_profiles_;
	/// Le calque contenant les voisinages
	IdCalqueVecteur layer_neighborhood_;
	/// Le calque contenant les arêtes (les relations de voisinage)
	IdCalqueVecteur layer_edges_;
	/// Le type du generateur de nombres aleatoires (GSL)
	const gsl_rng_type *GSL_RNG_TYPE_;
	/// Le generateur de nombres aleatoires (GSL)
	gsl_rng *GSL_RNG_;
	/// L'image sur laquelle on travaille
	boost::shared_ptr< TTImage <unsigned char> > image_;
};
Mais dès que je veux rajouter un paramètre template, ça foire :

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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
template < template <class ONP> class ObjectNeighborhoodPolicy = RectangleIntersectionNeighborhoodPolicy,
		   class EnergyPolicy = int,
		   class Nodes = Node_RectangleBiCircNeighborhoodProfiles,
		   class Edges = Weight,
		   class NodesContainer = boost::vecS,
		   class EdgesContainer = boost::vecS
		 > class MPP_Graph  : public BGL_Graph<NodesContainer,EdgesContainer,boost::undirectedS,Nodes,Edges>,
							  public ObjectNeighborhoodPolicy<Nodes>
{
public:
	/// Constructeur à partir d'un objet contenant les paramètres de l'algorithme et de l'affichage
	/// @param parameters Les paramètres de l'algorithme et de l'affichage
	MPP_Graph( const MPPParameters &parameters );
	/// Destructeur
	~MPP_Graph() {};
	/**
        * @name Méthodes pour l'affichage et sa gestion
        */
	/*@{*/
	/// Initialisation de l'affichage
	/// @param name Le nom de la fenêtre
	/// @param width La largeur de la fenêtre
	/// @param height La hauteur de la fenêtre
	void InitDisplay(std::string name = "MPP",
		unsigned int width = 200,
		unsigned int height = 200);
	/// Initialisation de l'affichage à partir d'un fichier XML
	/// @param XMLfilename Le nom du fichier XML
	void InitDisplayXML( const std::string &XMLfilename );
	/// Affichage de la fenêtre et de ses différents éléments (encapsule la méthode Draw)
	/// @param flags Flags pour le choix de ce qu'il faut afficher
	/// \sa GraphDraw
	void Display( unsigned int flags = GraphDraw::eDRAW_ALL );
	/*@}*/
 
	/// Affichage du graphe
	/// @param flags Flags pour le choix de ce qu'il faut afficher
	/// \sa GraphDraw
	void Draw( unsigned int flags = GraphDraw::eDRAW_ALL);
 
	/// Calcul des voisinages dans le graphe
	void ComputeNeighborhoods();
 
protected:
	/// Les différents paramètres associés à l'algorithme et à l'affichage
	MPPParameters MPPParameters_;
	/// Flag indiquant si l'affichage a été initialisé
	bool is_display_init_;
	/// La fenêtre d'affichage du graphe
	IdFenetreCalques window_;
	/// Le calque contenant les rectangles
	IdCalqueVecteur layer_rectangle_;
	/// Le calque contenant les profiles
	IdCalqueVecteur layer_profiles_;
	/// Le calque contenant les voisinages
	IdCalqueVecteur layer_neighborhood_;
	/// Le calque contenant les arêtes (les relations de voisinage)
	IdCalqueVecteur layer_edges_;
	/// Le type du generateur de nombres aleatoires (GSL)
	const gsl_rng_type *GSL_RNG_TYPE_;
	/// Le generateur de nombres aleatoires (GSL)
	gsl_rng *GSL_RNG_;
	/// L'image sur laquelle on travaille
	boost::shared_ptr< TTImage <unsigned char> > image_;
};
Les erreurs de Visual 2003 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
E:\MATIS\Codes\MATIS_DEV\include\structures\rjmcmc_graph_struct.hpp(156) : error C2977: 'MPP_Graph' : nombre d'arguments de modèle trop élevé
        E:\MATIS\Codes\MATIS_DEV\include\structures\rjmcmc_graph_struct.hpp(156) : voir la déclaration de 'MPP_Graph'
        E:\librairies\CGAL-3.3.1\include\CGAL\Root_of_traits.h(95) : voir la référence à l'instanciation du modèle de classe 'CGAL::CGALi::Root_of_traits_helper<FT,CGAL::Field_tag>' en cours de compilation
E:\MATIS\Codes\MATIS_DEV\include\structures\rjmcmc_graph_struct.hpp(177) : error C2504: 'MPP_Graph' : classe de base non définie
        E:\MATIS\Codes\MATIS_DEV\include\structures\rjmcmc_graph_struct.hpp(202) : voir la référence à l'instanciation du modèle de classe 'MPP_Rectangle_Graph<ObjectNeighborhoodPolicy,Nodes,Edges,NodesContainer,EdgesContainer>' en cours de compilation
e:\MATIS\Codes\MATIS_DEV\include\structures\rjmcmc_graph_struct.inl(26) : error C2955: 'MPP_Graph' : l'utilisation d'un modèle de classe nécessite une liste d'arguments de modèle
        E:\MATIS\Codes\MATIS_DEV\include\structures\rjmcmc_graph_struct.hpp(156) : voir la déclaration de 'MPP_Graph'
e:\MATIS\Codes\MATIS_DEV\include\structures\rjmcmc_graph_struct.inl(26) : error C2039: '__ctor' : n'est pas membre de 'MPP_Graph'
        E:\MATIS\Codes\MATIS_DEV\include\structures\rjmcmc_graph_struct.hpp(156) : voir la déclaration de 'MPP_Graph'
 
// ...
// ...
Au cas où, je mets la classe de base :

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
template <class NodesContainer = boost::vecS,
		  class EdgesContainer = boost::vecS,
		  class Directed = boost::undirectedS,
		  class NodesAttributes = boost::no_property,
		  class EdgesAttributes = boost::no_property
		 > class BGL_Graph : public boost::adjacency_list<NodesContainer,
														  EdgesContainer,
														  Directed,
														  NodesAttributes,
														  EdgesAttributes
														 >
{
public:
	BGL_Graph() {};
	~BGL_Graph() {};
 
	// Après, il n'y a que des typedefs ..
};
Je ne comprends pas ce message :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
error C2977: 'MPP_Graph' : nombre d'arguments de modèle trop élevé
Quel est le problème ?
D'avance merci