Problème déclaration classe template
Salut à tous,
J'ai un problème pour déclarer une classe template. Ca, ça marche :
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 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 ¶meters );
/// 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:
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 ¶meters );
/// 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:
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:
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:
error C2977: 'MPP_Graph' : nombre d'arguments de modèle trop élevé
Quel est le problème ?
D'avance merci