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 :

Définition const. & dest. d'une classe template


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 3
    Par défaut Définition const. & dest. d'une classe template
    J'ai hésité entre poster ici et sur le forum propre à Eclipse car je n'arrive pas à comprendre d'où vient mon problème, et s'il s'agit d'un problème lors du build automatique d'Eclipse ...

    Voilà le problème :
    j'ai une classe template Stack toute basique, avec un constructeur qui exige un paramètre : la taille de la pile, le tout sur deux fichiers : Stack.hpp et Stack.cpp comme suit :

    (code réduit au minimum, les deux fichiers sont bien dans un répertoire source nommé "tool")

    Stack.hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #ifndef _STACK_HPP_
    #define _STACK_HPP_
     
    template <typename T>
    class Stack {
     
    	private:
    		int	iSizeMax;
    		int	iSize;
    	public:
    		Stack(int size);
    		~Stack();
    };
    #endif // _STACK_HPP_
    Stack.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include "Stack.hpp"
     
    template <typename T>
    Stack<T>::Stack(int size) : iSizeMax(size), iSize(0) {
    	return;
    }
     
    template <typename T>
    Stack<T>::~Stack() {
    	return;
    }
    Jusque là aucun problème.
    Mais en essayant d'instancier une pile dans un fichier main.cpp j'obtiens une erreur :

    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #include "tool/Stack.hpp"
    int main() {
    	Stack<int> myStack(30);
    	return 0;
    }
    Les erreurs sont :
    1) ligne contenant : Stack<int> myStack(30);
    undefined reference to `Stack<int>::Stack(int)
    2) ligne contenant : return 0;
    undefined reference to `Stack<int>::~Stack()

    Lorsque je remplace directement dans la déclaration (.hpp) de ma classe le constructeur ou le destructeur par :
    Stack(int size) { }
    ~Stack() { }
    les erreurs correpondantes disparaissent, ce qui m'a fait penser à un problème de build où Eclipse essairait de compiler main.cpp avant Stack.cpp.

    Votre diagnostique ?
    je ne sais plus créer/instancier une malheureuse classe template, ou je dois commencer à utiliser mon propre Makefile ?

    Autre question au passage : quelle est la différence entre
    template <class T>
    et
    template <typename T> ?

  2. #2
    Membre confirmé
    Inscrit en
    Juin 2003
    Messages
    223
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Juin 2003
    Messages : 223
    Par défaut
    hummm test de mettre tout dans un fichier .hpp

    lit ca pour plus d'infos... Sinon pour les a<utres question je peux pas t'aider car je suis un peu perdu avec les template aussi

    http://cpp.developpez.com/faq/cpp/?p...VERS_templates

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 3
    Par défaut
    Citation Envoyé par elraton Voir le message
    hummm test de mettre tout dans un fichier .hpp

    lit ca pour plus d'infos... Sinon pour les a<utres question je peux pas t'aider car je suis un peu perdu avec les template aussi

    http://cpp.developpez.com/faq/cpp/?p...VERS_templates
    Merci pour le lien, j'essairai cette solution si on ne me propose rien de mieux, mais je reste très étonné de ce que j'y ai lu ...
    On m'a appris à la Fac à faire des classes templates dans des fichiers séparés, et on n'a jamais eu de problème à l'édition des liens, moi-même j'en ai fait plus d'une, c'est pour ça que je ne suis pas certain de comprendre pourquoi aujourd'hui les templates ont cessé de fonctionner :$

  4. #4
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par KuroAkisame Voir le message
    Merci pour le lien, j'essairai cette solution si on ne me propose rien de mieux, mais je reste très étonné de ce que j'y ai lu ...
    On m'a appris à la Fac à faire des classes templates dans des fichiers séparés, et on n'a jamais eu de problème à l'édition des liens, moi-même j'en ai fait plus d'une, c'est pour ça que je ne suis pas certain de comprendre pourquoi aujourd'hui les templates ont cessé de fonctionner :$
    C'est la seule solution pourtant. Ton code C++ template ne peut pas être instancié puisque le constructeur est défini dans un autre fichier. Lorsque tu compiles main.cpp, ce code template n'est pas connu -> plantage.

    Et le coup de séparer les classes template, c'est pas une bonne idée, surtout quand on ne sait pas comment ça fonctionne réellement (quelle idée de mettre unhe extension cpp, ce n'est pas du vrai code, c'est un patron). C'est sans doute que tu as plus fait de classes concrètes que de classes template.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 3
    Par défaut
    Citation Envoyé par Matthieu Brucher Voir le message
    C'est la seule solution pourtant. Ton code C++ template ne peut pas être instancié puisque le constructeur est défini dans un autre fichier. Lorsque tu compiles main.cpp, ce code template n'est pas connu -> plantage.

    Et le coup de séparer les classes template, c'est pas une bonne idée, surtout quand on ne sait pas comment ça fonctionne réellement (quelle idée de mettre unhe extension cpp, ce n'est pas du vrai code, c'est un patron). C'est sans doute que tu as plus fait de classes concrètes que de classes template.
    ok, j'avais cru.
    merci pour vos réponses.

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

Discussions similaires

  1. Définition de méthodes pour une classe template
    Par Pragmateek dans le forum Langage
    Réponses: 13
    Dernier message: 20/12/2008, 00h46
  2. Probleme avec une class template
    Par lenectar dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2006, 10h49
  3. Réponses: 4
    Dernier message: 08/11/2005, 15h10
  4. Trouver le Type d'une classe template dynamiquement ?
    Par Serge Iovleff dans le forum Langage
    Réponses: 3
    Dernier message: 23/09/2005, 16h48
  5. Séparer la définition et la déclaration d'une classe
    Par prgasp77 dans le forum Langage
    Réponses: 5
    Dernier message: 24/08/2005, 21h37

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