IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Problème déclaration classe template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut Problème déclaration classe template
    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

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Tu n'aurais pas oublié dans un bout de code une définition de MPP_Graph avec un argument de moins ? Tu as toujours le problème après recompilation totale ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Tu n'aurais pas oublié dans un bout de code une définition de MPP_Graph avec un argument de moins ?
    Après vérification, non
    Citation Envoyé par JolyLoic Voir le message
    Tu as toujours le problème après recompilation totale ?
    Malheureusement, oui ...

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Bon, en fait, c'était un peu sioux, et les messages d'erreur n'aidaient pas. Finalement, j'ai trouvé : la classe qui posait problème était déclarée friend dans une autre classe, et il fallait ajouter le paramètre template à cet endroit là aussi ...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de classe "template"
    Par Josiane22 dans le forum C++
    Réponses: 3
    Dernier message: 27/03/2013, 23h04
  2. Problème de classes template + CRTP
    Par Kaluza dans le forum Langage
    Réponses: 20
    Dernier message: 05/08/2012, 10h46
  3. problème avec classe template
    Par arthurembo dans le forum Langage
    Réponses: 2
    Dernier message: 09/02/2009, 07h46
  4. Problème de class template et std::map
    Par bathof dans le forum Langage
    Réponses: 2
    Dernier message: 31/07/2007, 22h18
  5. [DLL/classe template] problème de link
    Par Bob.Killer dans le forum C++
    Réponses: 7
    Dernier message: 31/08/2005, 18h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo