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 :

[POO/Template] Héritage de paramètre template.


Sujet :

Langage C++

  1. #1
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut [POO/Template] Héritage de paramètre template.
    Bonjour.

    J'ai un problème d'héritage d'une classe passée en paramètre template déclarée comme suit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <class Elem> class ncp_Elem : public Elem {
    	private: 
    		unsigned int numid;//id of Elem in list
    	public:
    		ncp_Elem(const unsigned int & id);
    		ncp_Elem(const ncp_Elem<Elem> & elm, const unsigned int & id);
    		~ncp_Elem(); //delete control
    };
    lorsque je ne déclare pas ses fonctions, le code compile.

    par contre, quand j'explicite ses fonctions à l'exterieur de la classe mais dans le même .h avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ncp_Elem<class Elem>::ncp_Elem(const unsigned int &id):numid(id)
    {}
    Il me fait l'erreur suivante:
    1>c:\...\ncp_mat.h(11) : error C2504: 'Elem' : classe de base non définie
    1> c:\...\ncp_mat.h(57) : voir la référence à l'instanciation de la classe modèle 'ncp_Elem<Elem>' en cours de compilation
    1> with
    1> [
    1> Elem=Elem
    1> ]
    j'utilise VC++2005 express.


    si vous avez une idée....

    merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    Soit tu dois définir tes fonctions directement dans la classe template, sous la forme de
    template<class T>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MaClass : public Mere
    {
        public:
            void foo(const T& t)
            {
                /* do something */
            }
    };
    soit tu doit "rappeler" au compilateur qu'il a affaire à une méthode issue d'une classe template, sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <class T>
    class MaClass : public Mere
    {
        public:
            void foo(const T&);
    };
    template <class T>
    void MaClass<T>::foo(const T& t)
    {
        /* do something */
    }
    Tu peux choisir les deux solutions de manière tout à fait indifférente et selon ce que tu préfères au niveau de la lisibilité: certains préféreront avoir l'implémentation des fonctions directement au sein de la classe, et d'autres préféreront avoir les implémentation en dehors
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Les implémentations en dehors sont nécessaires pour certains cas, ce n'est pas simplement un choix de lisibilité...

    Sinon le problème c'est que ta syntaxe n'est pas la bonne.
    Ce n'est pas
    ncp_Elem<class Elem>::ncp_Elem(const unsigned int &id):numid(id)
    {}
    mais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <class Elem> ncp_Elem<Elem>::ncp_Elem(const unsigned int &id):numid(id)
    {}
    Boost ftw

  4. #4
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Merci loufoque, ta syntaxe marche nickel.

    Par contre, je rencontre la même erreur avec la ligne suivante:"error C2504: 'Elem' : classe de base non définie" sur le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list_elem.push_back(ncp_Elem<Elem>(fillwith,0));
    sachant que fillwith est un élément de type Elem et que j'ai déclaré dans ma classe principale(ncp_mat):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template <class Elem> class ncp_Elem : public Elem {
    	...
    	public:
    		...
    		ncp_Elem(const Elem & elm, const unsigned int & id);
    };
    Si vous avez une idée sur l'origine de l'erreur ....

    merci
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Il manque du code: où se trouve cette ligne?

  6. #6
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    elle se trouve dans la fonction suivante (dont j'ai retiré les éléments "inutiles"):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    template <class Elem>ncp_mat<Elem>::ncp_mat(const unsigned int &h, const unsigned int &w, const bool &fill, const Elem &fillwith){
    	if(w==0 && h==0){
    		init=false;
    	}else{
    		//...
    		list_elem=std::vector<ncp_Elem<Elem>>();
    		list_elem.push_back(ncp_Elem<Elem>(fillwith,0));//là plantage
    	}
    }
    sachant que cette fonction fait référence à la classe ncp_mat dont voici un abrégé de la déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<class Elem>
    class ncp_mat {
    private:
    	std::vector<ncp_Elem<Elem>> list_elem;// contain differents elements. The first element(0) is always the default one
    public:
    	ncp_mat(const unsigned int &h, const unsigned int &w, const bool &fill, 
    		  const Elem &fillwith);//h : height, w : with
     
    	friend ncp_Elem<Elem>;
    };
    Merci de votre aide
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    ncp_Elem est définie quelque part? Son include est bien dans ncp_mat?

  8. #8
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par 3DArchi
    ncp_Elem est définie quelque part?
    oui

    Citation Envoyé par méphistopheles Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    template <class Elem> class ncp_Elem : public Elem {
    	private: 
    		unsigned int numid;//id of Elem in list
    	public:
    		ncp_Elem(const unsigned int & id);
    		ncp_Elem(const Elem & elm, const unsigned int & id);
    		~ncp_Elem(); //delete control
    };

    elle est définie juste au dessus de ncp_mat.
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Comment as-tu instancié ncp_mat? Si je reprend ton code, moi le code suivant fonctionne:
    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
    struct tutu
    {
    };
    template <class Elem> class ncp_Elem : public Elem {
    private: 
    	unsigned int numid;//id of Elem in list
    public:
       ncp_Elem(const unsigned int & id){}
       ncp_Elem(const Elem & elm, const unsigned int & id){}
       ~ncp_Elem(){}
    };
     
    template<class Elem>
    class ncp_mat {
    private:
    	std::vector<ncp_Elem<Elem>> list_elem;// contain differents elements. The first element(0) is always the default one
    public:
    	ncp_mat(const unsigned int &h, const unsigned int &w, const bool &fill, 
    		  const Elem &fillwith);//h : height, w : with
     
    	friend ncp_Elem<Elem>;
    };
     
     
    template <class Elem>ncp_mat<Elem>::ncp_mat(const unsigned int &h, const unsigned int &w, const bool &fill, const Elem &fillwith){
    	if(w==0 && h==0){
    		bool init=false;
    	}else{
    		//...
    		list_elem=std::vector<ncp_Elem<Elem>>();
    		list_elem.push_back(ncp_Elem<Elem>(fillwith,(unsigned int)0));//là plantage
    	}
    }
     
    int main()
    {
       ncp_mat<tutu> l_(0,0,false,tutu());
       return 0;
    }
    Donc, je dirais que ton problème doit être lié à ce que tu as mis à la place de 'tutu'?

  10. #10
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Merci 3DArchi, c'étais exactement ça, le paramètre passé en fonction n'étais autre que...ncp_mat lui même (je devais pas avoir dormi lorsque j'ai tapé ça) d'où l'erreur à la compilation... ce qui est curieux, c'est que la ligne qui générais l'erreur n'étais pas dans le même fichier et qu'il me compilait tout a fait ce premier fichier...


    Enfin bon, merci encore, je suis débloqué
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

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

Discussions similaires

  1. [template]Héritage d'une Template par une Classe
    Par koni33 dans le forum Langage
    Réponses: 0
    Dernier message: 11/05/2008, 14h12
  2. Appeler une méthode template d'un paramètre template
    Par YéTeeh dans le forum Langage
    Réponses: 2
    Dernier message: 26/08/2006, 12h50
  3. Réponses: 15
    Dernier message: 21/08/2006, 01h41
  4. Déclarer un paramètre template comme friend
    Par YéTeeh dans le forum Langage
    Réponses: 4
    Dernier message: 11/04/2006, 14h00
  5. X paramètres templates
    Par Alp dans le forum C++
    Réponses: 8
    Dernier message: 04/04/2006, 22h10

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