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

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

Marsh Posté le 04-03-2007 à 13:47:42    

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
Reply

Marsh Posté le 04-03-2007 à 13:47:42   

Reply

Marsh Posté le 04-03-2007 à 14:31:24    

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.

Reply

Marsh Posté le 04-03-2007 à 20:49:24    

++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.
Reply

Marsh Posté le 05-03-2007 à 00:02:10    

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.

Reply

Marsh Posté le 05-03-2007 à 00:09:49    

++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.
Reply

Marsh Posté le 05-03-2007 à 00:27:12    

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
Reply

Marsh Posté le 05-03-2007 à 00:35:40    

++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.
Reply

Marsh Posté le 05-03-2007 à 00:51:26    

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.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed