OVH Cloud OVH Cloud

Problème avec iostream

11 réponses
Avatar
Etienne Rousee
Bonjour,

Quelqu'un connaît il l'erreur suivante (VC++ 6.0, Projet console W32 sans
MFC, erreur au link) :

TestPoly.obj : error LNK2001: unresolved external symbol "class
std::basic_ostream<char,struct std::char_traits<char> > & __cdecl
operator<<(class std::basic_ostream<char,struct std::char_traits<char> >
&,class Rationnel &)"
(??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAVRationnel@@@
Z)

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.

Etienne

1 réponse

1 2
Avatar
Jean-Sebastien Mouret
"Etienne Rousee" writes:

"Jean-Sebastien Mouret" a écrit ...
"Etienne Rousee" writes:

"Etienne Rousee" 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

template ostream& operator<< <int>(ostream& out, Point<int>&p);
template ostream& operator<< <float>(ostream& out, Point<double>&p);

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.



--
js



1 2