Classe génériques et pointeur (Dev cpp) [C++] - C++ - Programmation
Marsh Posté le 04-03-2007 à 14:31:24
samsayan a écrit : |
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 : |
C'est la solution la plus simple. Mais il y en a d'autres.
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 ?
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.
Marsh Posté le 05-03-2007 à 00:09:49
++fab a écrit : - Utiliser le modèle de séparation, c'est à dire export. |
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
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 |
Précises, les questions ! merci
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 :
|
Je sais pas pourquoi, je l'ai juste lut rapidement et j'ai pas testé, faudrait que je retrouve la source.
++fab a écrit :
|
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
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.
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 :
- Un fichier .C contenant l'implémentation :
- Un fichier client main.C
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 édité par samsayan le 04-03-2007 à 13:52:09