Découpage de classe - instanciation template

vdox Messages postés 5 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 17 juin 2013 - 2 déc. 2010 à 17:29
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 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 ?

merce d'avance

4 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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_ */


MaClasse1.hxx
template <typename unEntier>
void
MaClasse::f1()
{
}


MaClasse2.hxx
template <typename unEntier>
void
MaClasse::f2()
{
}


main.cpp
#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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
vdox Messages postés 5 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 17 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 ?

merci encore
0
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
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.

C'est strictement équivalent à:
#ifndef FICHIER_HPP_
# define FICHIER_HPP_

template  
class MaClass
{
  void f1();
  void f2();
};

template <typename unEntier>
void
MaClasse::f1()
{
}

template <typename unEntier>
void
MaClasse::f2()
{
}

#endif /* !FICHIER_HPP_ */



Les .hxx ne sont là que par propreté.

________________________________________________________________________
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