Découpage de classe - instanciation template

Signaler
Messages postés
5
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
17 juin 2013
-
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
-
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

Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
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
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
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
Messages postés
5
Date d'inscription
vendredi 10 octobre 2003
Statut
Membre
Dernière intervention
17 juin 2013

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
Messages postés
3839
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
15 avril 2021
120
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