vdox
Messages postés5Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention17 juin 2013
-
2 déc. 2010 à 17:29
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023
-
2 déc. 2010 à 18:26
Bonjour, j'ai créé une classe template.
De façon très classique, la déclaration est dans le .hpp et la définition des fonctions dans le cpp.
J'aimerai maintenant que certaines fonctions de ma classe soient dans d'autres fichiers .cpp
Or je crois qu'il faut instancier les fonction templates dans le .cpp sinon le complilateur ne peut pas trouver le code associé a ma fonction.
J'ai essayé le code suivant :
(maclasse.hpp)
template
class MaClass:
{
//constructeur
void uneFonction();
void uneAutreFonction();
}
//je dois instancier ici la fonction qui n'est pas dans maclass.cpp
template class maclasse<1>;
template maclass<1>::uneAutreFonction();
(maclass.cpp)
template
void MaClass<1>::uneFonction()
{// fait plein de choses}
(UnAutreFichier.cpp)
template
void MaClass<1>::uneAutreFonction()
{// fait plein de choses}
or le compilateur me donne l'erreur :
error : explicit instantiation of uneAutreFonction but no definition avaiable
avez vous une idée de la bonne démarche a suivre pour découper en plusieurs fichiers une classe template ?
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 2 déc. 2010 à 18:02
Tu ne peux pas mettre le code d'un template dans un .cpp, tout simplement !
Les templates ne sont pas du code, mais des générateurs de code. Ils doivent donc être dans des headers.
Pour pouvoir séparer correctement cela, on utilise gnéralement des .hxx.
C'est à dire:
fichier.hpp
#ifndef FICHIER_HPP_
# define FICHIER_HPP_
template
class MaClass
{
void f1();
void f2();
};
# include "MaClasse1.hxx"
# include "MaClasse2.hxx"
#endif /* !FICHIER_HPP_ */
#include "MaClasse.hpp"
int main()
{
MaClasse<5> ma_classe;
return 0;
}
PS: Tu peux aussi mettre f1 et f2 dans un seul fichier "MaClasse.hxx".
PPS: Je n'ai rien testé, mais je pense que c'est syntaxiquement correct.
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 2 déc. 2010 à 18:03
Je ne peux pas éditer mon post...
Il fallait lire MaClasse.hpp et non fichier.hpp pour le nom du premier fichier.
(fichier.hpp => MaClasse.hpp)
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
vdox
Messages postés5Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention17 juin 2013 2 déc. 2010 à 18:21
Effectivement, je viens de tester et ça marche ! merci beaucoup.
Par contre je ne comprend pas pourquoi, je croyais que l'extension du fichier importait peu ... et là juste en changeant cpp en hxx, la compilation change ...
comment cela se fait il ?
cptpingu
Messages postés3837Date d'inscriptiondimanche 12 décembre 2004StatutModérateurDernière intervention28 mars 2023123 2 déc. 2010 à 18:26
Observe bien...
Ce qui a changé n'est pas l'extension, mais la manière de déclarer. Tu remarqueras surtout que les fichiers .hxx sont inclus dans le .hpp ! C'est comme si j'écrivais le code dans le .hpp à la suite de la classe.
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question