Classe et heritage

malkommalkom Messages postés 36 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 7 novembre 2010 - 7 nov. 2010 à 12:34
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 8 nov. 2010 à 10:02
Bonjour a tous

Bon alors voila :

j'ai une classe :

template <typename TDATA>
class maClasse
{

public:

maClasse();
~maClasse();

};
template <typename TDATA>
class maSousClasse, public maClasse<TDATA>
{

public:

maSousClasse();
~maSousClasse();

};

Je creer ma librairie, tout compile.

J'utilise ma librairie dans un main pour la tester

maSousClasse monTest;

//action de test......

et j'ai :

Undefined reference to maClasse::maClasse()
Undefined reference to maClasse::~maClasse()
Undefined reference to maSousClasse::maSousClasse()
Undefined reference to maSousClasse::~maSousClasse()


j'ai bien sur vérifié que les .cpp compiler dans la librairie et c'est le cas.

N'aurais -t-on donc pas le droit de faire herité d'une classe en lui donnant (a la mere) le template de la fille?


DeleteFile("C:\\AUTORUN.EXE");

8 réponses

DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 nov. 2010 à 18:48
Salut,

Premiere chose, si tu donnes un template a ta classe mere pourquoi veux tu donner ce meme template a la classe fille ?

Deuxieme chose, revoi la manière dont tu écris ton héritage.
l'héritage s'écrit avec : et non pas avec une virgule, sauf pour l'initialisation des paramètres.

Shell
0
malkommalkom Messages postés 36 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 7 novembre 2010
7 nov. 2010 à 19:35
Salut, la virgule est une faute de frappe, j'ai bien ':'

Mais mon problème se révèle plus complexe que sa :

j'effectu ce test :

test.h
template <typename T_DATA>
class myTest
{
 public:
  myTest();       
};
void FonctionTest();



test.cpp
template <typename T_DATA>
myTest<T_DATA>::myTest()
{
//rien c'est juste pour tester l'appel
}

void FonctionTest()
{
//rien c'est juste pour tester l'appel
}


main.h
#include "test.h"


main.cpp
#include "main.h"

int main()
{
 myTest test;

 Fonctiontest();
}


et j'ai : linker error : undefined reference to myTest::myTest()

Lorse que je supprime la declaration de test ca compile et link sans problemme.




DeleteFile("C:\\AUTORUN.EXE");
0
malkommalkom Messages postés 36 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 7 novembre 2010
7 nov. 2010 à 19:41
PS :

Désoler pour les fautes ainsi que le Fonctiontest(); dans main.cpp,

j'appelle bien FonctionTest(); . Je me suis tromper de bouton en cliquant sur envoyer au lieux d'aperçu

DeleteFile("C:\\AUTORUN.EXE");
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 nov. 2010 à 20:12
Ca pourrait être utile d'ajouter #include "test.h" tu crois pas ?

Shell
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 nov. 2010 à 20:30
Bon j'ai sérieusement besoin de me réveiller.
Le include est bien la, juste trop petit pour mes yeux encore fermé.

Tu as un erreur car tu as séparré la déclaration et l'implémentation de ton template dans un .h et un .cpp.

Un template ne peut pas être splitté!

Shell
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
7 nov. 2010 à 20:33
Manque un morceau...

La solution est de tout mettre dans ton header (test.h).
Dernière chose, par habitude on donne à la class le nom du fichier pour plus de lisibilité.

Shell
0
malkommalkom Messages postés 36 Date d'inscription mercredi 1 novembre 2000 Statut Membre Dernière intervention 7 novembre 2010
7 nov. 2010 à 23:25
Merci beacoup , reponse claire et precise.

J'avais effectivement remarquer que quand je le metter dans le header sa marcher.

Mais il me semble que j'avais déjà reussis a "splitter" un template.

Quoiqu'il en soit, il est donc impossible de mettre un template en librairie? Il sera forcement visible par le client qui l'utiliserait?

Merci encore.

DeleteFile("C:\\AUTORUN.EXE");
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
8 nov. 2010 à 10:02
Il est possible de "splitter" une implémentation de header de sa définition, indirectement.
On utilise généralement un .hxx inclut par le .hh, regarde dans mes sources je le fais.

De même, un template n'étant qu'un code crée au moment de son appel, on ne peux le mettre dans une bibliothèque (librairie == erreur de traduction), et on donc doit distribuer les headers contenant des templates.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous