Classe et heritage

Messages postés
36
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
7 novembre 2010
-
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
-
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

Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
36
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
7 novembre 2010

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");
Messages postés
36
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
7 novembre 2010

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");
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
Ca pourrait être utile d'ajouter #include "test.h" tu crois pas ?

Shell
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
2670
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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
Messages postés
36
Date d'inscription
mercredi 1 novembre 2000
Statut
Membre
Dernière intervention
7 novembre 2010

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");
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
20 octobre 2021
125
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