begin process at 2012 05 28 19:56:52
  Trouver un code source :
 
dans
 
Accueil > Forum > 

C

 > 

Divers

 > 

Général

 > 

découpage de classe - instanciation template


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

découpage de classe - instanciation template

jeudi 2 décembre 2010 à 17:29:26 | découpage de classe - instanciation template

vdox

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 <int unEntier>
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<int unEntier>
void MaClass<1>::uneFonction()
{// fait plein de choses}

(UnAutreFichier.cpp)
template<int unEntier>
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
jeudi 2 décembre 2010 à 18:02:02 | Re : découpage de classe - instanciation template

CptPingu

Administrateur CodeS-SourceS
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
Code C/C++ :
#ifndef FICHIER_HPP_
# define FICHIER_HPP_

template <int unEntier> 
class MaClass
{
  void f1();
  void f2();
};

# include "MaClasse1.hxx"
# include "MaClasse2.hxx"

#endif /* !FICHIER_HPP_ */


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


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


main.cpp
Code C/C++ :
#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
Merci d'utiliser Réponse acceptée si un post répond à votre question
jeudi 2 décembre 2010 à 18:03:32 | Re : découpage de classe - instanciation template

CptPingu

Administrateur CodeS-SourceS
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
Merci d'utiliser Réponse acceptée si un post répond à votre question
jeudi 2 décembre 2010 à 18:21:04 | Re : découpage de classe - instanciation template

vdox

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
jeudi 2 décembre 2010 à 18:26:44 | Re : découpage de classe - instanciation template

CptPingu

Administrateur CodeS-SourceS
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 à:
Code C/C++ :
#ifndef FICHIER_HPP_
# define FICHIER_HPP_

template <int unEntier> 
class MaClass
{
  void f1();
  void f2();
};

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

template <typename unEntier>
void
MaClasse<unEntier>::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
Merci d'utiliser Réponse acceptée si un post répond à votre question


Cette discussion est classée dans : classe, void, template, cpp, maclass


Répondre à ce message

Sujets en rapport avec ce message

Probleme d'inclusion de fichier (.hpp Vs .cpp)? [ par ano2345 ] Bonjour a tous,Je suis en train de developper sous Dev-C++ 4.9.9.2 une classe template MyVector basee sur la classe vector de telle maniere que je pui Cast void* - objet C++ [ par zaraki21 ] Bonjour, Je travaille actuellement sur un projet en C/C++ dans lequel je souhaite "caster" un membre d'une classe de type void* en un pointeur sur un Les listes chaînées [ par paras00 ] Bonjour ; j'aimerai bien ke vous m'aidez à resoudre une erreur dans mon programme [^^sad1] [code=cpp] #include typedef void* T ; class element { Débutant : Inclusion de header dans main.cpp + problème de déclaration de classe [ par goddez ] Bonjour à tous :), Je rencontre un problème plutôt spéciale depuis 2 jours et je n'arrive pas à mettre le doigt sur ce qui n'est pas correct. Je décla Problème de lisibilité : Implémenter les fonctions d'une classe dans plusieurs fichiers [ par gilleshugues ] Voila je pense que ça doit être tout simple à faire . Etant habitué à VB et VFP , j'avais pour habitude de fractionner le codeen plusieurs fichiers po héritage d'une template classe comme vector [ par Urukai1 ] bonjourje suis un newbie en cpp, et j'ai fait beaucoup de javaje souhaite faire une classe qui herite par exemple de la classe vector avec template,le perdu des fonctionsde la librairie classe RS232 de lserie.cpp [ par josmaur ] bonjour messieurs mesdames Dans le code source l' exemple :utilisation de la classe RS232 avec API (lserie.cpp & lserie.h)  pour gerer la RS232 ave Recuperer le type d'un template [ par juju0169 ] Bonsoir! Désolé de vous déranger mais j'ai un petit soucis que je ne vois pas comment résoudre.Je vais essayer d'être le plus clair possible!VOilà j'a AXIS C++ / VS 2003 / WebServices [ par CSharpJSharp ] Bonjour tout le monde ;J'utilise AXIS C++ (http://ws.apache.org/axis/cpp/download.html) qui me génère le source C++ (.cpp et .hpp) à partir d'un fichi Liste comportant une classe template [ par horcks ] Bonjour, J'aurais voulu savoir s'il est possible de créer une liste contenant une classe template. Je m'explique : Voici le code (écourté) du template


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,902 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales