Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1659 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Classe génériques et pointeur (Dev cpp)

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Classe génériques et pointeur (Dev cpp)

n°1523383
samsayan
Posté le 04-03-2007 à 13:47:42  profilanswer
 

Bonjour à tous,
Voila j'ai un problème de compilation, pas une erreur de synthaxe mais je pense que c'est du a l'organisation de mes fichiers.
 
En cours nous avons vu que pour utiliser une classe générique :
 
- Un fichier Header (.h) contenant la specification de la classe :

Code :
  1. template <class T>
  2. class toto


 
- Un fichier .C contenant l'implémentation :

Code :
  1. #include "toto.h"
  2. //exemple sur le contructeur
  3. template <class T>
  4. toto<T> :: toto()


 
- Un fichier client main.C

Code :
  1. #include "toto.h"
  2. //Le problème se situe la :
  3. toto<int> var;
  4. toto.afficher();


 
Erreurs retournée :  
[Linker error] undefined reference to `toto<int>::toto()'  
[Linker error] undefined reference to `toto<int>::afficher() const'  
 
Savez pourquoi cela ne marche pas ? Dois-je mettre le code de mon implantation dans le fichier .h ?
Je précise que toto est une classe Liste qui utilise des pointeurs dans l'implémentation...
 
Merci de votre aide

Message cité 1 fois
Message édité par samsayan le 04-03-2007 à 13:52:09
mood
Publicité
Posté le 04-03-2007 à 13:47:42  profilanswer
 

n°1523386
++fab
victime du syndrome IH
Posté le 04-03-2007 à 14:31:24  profilanswer
 

samsayan a écrit :


Erreurs retournée :  
[Linker error] undefined reference to `toto<int>::toto()'  
[Linker error] undefined reference to `toto<int>::afficher() const'  
 
Savez pourquoi cela ne marche pas ?


Car le linker ne trouve pas la définition de toto<int>::toto(), et de toto<int>::afficher() const.
Et pour cause : le compilateur ne les a jamais instanciées.
 

samsayan a écrit :


Dois-je mettre le code de mon implantation dans le fichier .h ?


C'est la solution la plus simple. Mais il y en a d'autres.

n°1523452
0x90
Posté le 04-03-2007 à 20:49:24  profilanswer
 

++fab a écrit :

C'est la solution la plus simple. Mais il y en a d'autres.

 

Du genre ?

Message cité 1 fois
Message édité par 0x90 le 04-03-2007 à 20:49:33

---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1523491
++fab
victime du syndrome IH
Posté le 05-03-2007 à 00:02:10  profilanswer
 

0x90 a écrit :

Du genre ?


- Utiliser le modèle de séparation, c'est à dire export.
- Utiliser l'instanciation explicite.
- Utiliser un mix entre instanciation explicite et implicite.
 
Je n'ai pas développé, mais si tu as des questions, je peux développer.

n°1523493
0x90
Posté le 05-03-2007 à 00:09:49  profilanswer
 

++fab a écrit :

- Utiliser le modèle de séparation, c'est à dire export.
- Utiliser l'instanciation explicite.
- Utiliser un mix entre instanciation explicite et implicite.
 
Je n'ai pas développé, mais si tu as des questions, je peux développer.


 
Le premier j'avais cru comprends que c'était pas implémenté et le second que c'était un merdier à grande échelle. mais oui je veut bien des développements :jap:


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1523496
++fab
victime du syndrome IH
Posté le 05-03-2007 à 00:27:12  profilanswer
 

0x90 a écrit :

Le premier j'avais cru comprends que c'était pas implémenté


Il y a des compilateurs qui l'implémentent : ICC, je l'ai (gratuit pour une utilisation non commerciale). Et como, je ne l'ai pas acheté, mais il est pas très cher, et j'y songe parfois. (peut être d'autres, je ne sais pas)

 
Citation :

et le second que c'était un merdier à grande échelle.


Pourquoi ?
Par exemple, lorsque tu utilises des templates qui ne doivent être instanciées qu'avec float, double et long double, tu peux t'en servir. Tu économiseras du temps de compilation, des recompilations, et éventuellement des répliques de code. En revanche, si c'est placé dans une bibliothèque dynamique, il y a aura probablement du code inutilisé.

 

La troisième solution permet de jouer sur le temps de compilation, les éventuels répliques de code, mais pas sur les recompilations (les définitions sont toutes placées dans le header). Elle permet en plus l'instanciation implicite. Cette solution fonctionne avec l'extension commune "extern template", qui permet de controler l'instanciation.

 
Citation :

mais oui je veut bien des développements :jap:


Précises, les questions ! merci :o

Message cité 1 fois
Message édité par ++fab le 05-03-2007 à 00:30:51
n°1523498
0x90
Posté le 05-03-2007 à 00:35:40  profilanswer
 

++fab a écrit :

Il y a des compilateurs qui l'implémentent : ICC, je l'ai (gratuit pour une utilisation non commerciale). Et como, je ne l'ai pas acheté, mais il est pas très cher, et j'y songe parfois.


Ça reste pas généralisé du tout du tout :/

++fab a écrit :


Citation :

et le second que c'était un merdier à grande échelle.


Pourquoi ?
Par exemple, lorsque tu utilises des templates qui ne doivent être instanciées qu'avec float, double et long double, tu peux t'en servir. Tu économiseras du temps de compilation, des recompilations, et éventuellement des répliques de code. En revanche, si c'est placé dans une bibliothèque dynamique, il y a aura probablement du code inutilisé.


Je sais pas pourquoi, je l'ai juste lut rapidement et j'ai pas testé, faudrait que je retrouve la source.

++fab a écrit :


La troisième solution permet de jouer sur le temps de compilation, les éventuels répliques de code, mais pas sur les recompilations (les définitions sont toutes placées dans le header). Elle permet en plus l'instanciation implicite. Cette solution fonctionne avec l'extension commune "extern template", qui permet de controler l'instanciation.
 

Citation :

mais oui je veut bien des développements :jap:


Précises, les questions ! merci :o


Bah euh, ça c'était déjà un dével intéressant.
Cela dit, l'instanciation explicite avec les templates fortement récursifs, ça doit pas être super marrant des fois :/


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
n°1523501
++fab
victime du syndrome IH
Posté le 05-03-2007 à 00:51:26  profilanswer
 

0x90 a écrit :

Ça reste pas généralisé du tout du tout :/


Effectivement, on peut pas dire. Mais bon, ce n'est pas une légende, export, ça existe. Et vu la proportion de compilateurs qui dispose d'infrastructures pour faire de l'optimisation à l'édition de lien, l'implémentation d'export devrait suivre, espérons.  
 

Citation :

Je sais pas pourquoi, je l'ai juste lut rapidement et j'ai pas testé, faudrait que je retrouve la source.


Si tu peux borné les types que tu veux voir instancier, c'est gérable. Dans le cas contraire, je ne m'y aventurerais pas...
 

Citation :

Cela dit, l'instanciation explicite avec les templates fortement récursifs, ça doit pas être super marrant des fois :/


L'intérêt de l'instanciation explicite tient au fait que tu ne l'instancieras qu'une seule fois. Au moins, il faut se débrouiller pour que ce soit bien le cas.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Classe génériques et pointeur (Dev cpp)

 

Sujets relatifs
[C++]test sur le contenu d'un pointeurFonction renvoyant pointeur de structure [Résolu]
[résolu] Probleme d'appel d'un objet dans ma classe[C#] [Résolu] Comment communiquer avec une dll c++
typer paramètres d'une méthode de classePointeur de fonction membre avec heritage
pointeur sur std::vector<T>[PHP] Classe MYSQL impossible d'accéder aux attributs de la classe
Techniques de Dev PHP ?Pointeur de tableau de pointeurs de strings....
Plus de sujets relatifs à : [C++] Classe génériques et pointeur (Dev cpp)


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR