J'ai impléménté une classe Rationnel, et j'ai voulu surcharger le chevron
sortant:
ostream& operator<<(ostream&, Rationnel &);
C'est en prototype, en amie dans la classe, et codé.
Evidemment, tout fonctionne quand j'enlève les affichages.
J'ai un Rationnel.h, un Rationnel.cpp, un principal, et
quelques autres fichiers.
Je subodore qu'il y a un rapport avec la différence entre
<iostream> et <iostream.h>, mais ça m'échappe.
Bon, je n'ai pas eu trop de temps cette semaine, mais voilà, en enlevant plein de choses, le code suivant compile mais le link plante. Il n'y a plus d'erreur si j'enlève les cout.
si quelqu'un a une idée ?
bouge la definition de l'operator<< template dans le header, ca devrait etre bon.
Ça marche, mais j'aimerais comprendre pourquoi.
une autre solution est de rajouter les instanciations qui vont bien dans le fichier point.cpp
en gros, le code d'un template n'est généré que quand tu le spécialises (tu l'utilises quoi). Ce qui se passe dans ton cas, dans TestPoint.cpp, au moment où tu fais les cout<<, le compilo va chercher les operator<<. Il voit la declaration de ton template mais il n'a pas la définition (le code), donc il rajoute ca dans ses fonctions à linker plus tard. dans point.cpp, le code est présent mais aucune utilisation n'est faite, donc aucun code généré. au final, le linker n'a le code nul part.
soluce 1: bouger la définition dans le header, testpoint.cpp a donc le code sous la main et inline directement.
soluce 2: lui faire générer le code explicitement dans point.cpp et donc linker bien.
"Etienne Rousee" <etienne.rousee@wanadoo.fr> a écrit ...
Bon, je n'ai pas eu trop de temps cette semaine, mais voilà, en
enlevant plein de choses, le code suivant compile mais le link
plante. Il n'y a plus d'erreur si j'enlève les cout.
si quelqu'un a une idée ?
bouge la definition de l'operator<< template dans le header, ca
devrait etre bon.
Ça marche, mais j'aimerais comprendre pourquoi.
une autre solution est de rajouter les instanciations qui vont bien
dans le fichier point.cpp
en gros, le code d'un template n'est généré que quand tu le
spécialises (tu l'utilises quoi). Ce qui se passe dans ton cas, dans
TestPoint.cpp, au moment où tu fais les cout<<, le compilo va chercher
les operator<<. Il voit la declaration de ton template mais il n'a pas
la définition (le code), donc il rajoute ca dans ses fonctions à
linker plus tard. dans point.cpp, le code est présent mais aucune
utilisation n'est faite, donc aucun code généré. au final, le linker
n'a le code nul part.
soluce 1: bouger la définition dans le header, testpoint.cpp a donc le
code sous la main et inline directement.
soluce 2: lui faire générer le code explicitement dans point.cpp et
donc linker bien.
Bon, je n'ai pas eu trop de temps cette semaine, mais voilà, en enlevant plein de choses, le code suivant compile mais le link plante. Il n'y a plus d'erreur si j'enlève les cout.
si quelqu'un a une idée ?
bouge la definition de l'operator<< template dans le header, ca devrait etre bon.
Ça marche, mais j'aimerais comprendre pourquoi.
une autre solution est de rajouter les instanciations qui vont bien dans le fichier point.cpp
en gros, le code d'un template n'est généré que quand tu le spécialises (tu l'utilises quoi). Ce qui se passe dans ton cas, dans TestPoint.cpp, au moment où tu fais les cout<<, le compilo va chercher les operator<<. Il voit la declaration de ton template mais il n'a pas la définition (le code), donc il rajoute ca dans ses fonctions à linker plus tard. dans point.cpp, le code est présent mais aucune utilisation n'est faite, donc aucun code généré. au final, le linker n'a le code nul part.
soluce 1: bouger la définition dans le header, testpoint.cpp a donc le code sous la main et inline directement.
soluce 2: lui faire générer le code explicitement dans point.cpp et donc linker bien.