Bonjour,
Je poste ce petit message car je vient de remarquer un comportement tres étrange du compilateur C++ de VisualStudio 2008...
Je souhaitais implémenter une petite classe permettant la manipulation de nombres complex et tant qu' a faire, template, histoire de manipuler des Complex<float>, Complex<double> ou bien Complex<long> celons les circonstances.
Jusque la, pas de problème, je déclare ma classe, mes fonctions, ca compile, le monde est rose, les oiseaux chantent.
Mais tout bascule quand me vient l'idée d'implémenter une surcharge de l' opérateur << pour std::ostream.
Je la declare :
puis je l' implémente :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 template<class T> class Complex { public: Complex(T real = 0, T imag = 0) :_real(real), _imag(imag) {} Complex(Complex<T>& cpy) :_real(cpy._real), _imag(cpy._imag) {} inline T& real(); inline T& imag(); /* ... */ friend inline std::ostream& operator <<(std::ostream& oss, Complex<T>& c); private: T _real; T _imag; };
Mais si je souhaite compiler avec une ligne comme std::cout << un_complex; :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 template<class T> inline std::ostream& operator <<(std::ostream& oss, Complex<T>& c) { oss << c._real << " + " << c._imag << "i"; return (oss); }
Si je place l'implémentation dans le corp de ma classe, ça fonctionne.
Code : Sélectionner tout - Visualiser dans une fenêtre à part Error 2 error LNK2019: 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 Complex<float> &)" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@AAV?$Complex@M@@@Z) referenced in function "public: static int __cdecl Worker::DivIndex(class Complex<float>,float,int)" (?DivIndex@Worker@@SAHV?$Complex@M@@MH@Z) Work.obj Mandelbrot
J' ai bien trouvé un message qui ressemble :
http://www.developpez.net/forums/d53...ame-injection/
Mais je ne parvient pas a comprendre la logique du compilateur pour finalement chercher une fonction qui n'existe pas....
Si quelqu'un pouvais m'expliquer le pourquoi et le comment cela pourrait éclaircir mes idées.
Partager