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 :
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;
};
puis je l' implémente :
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);
}
Mais si je souhaite compiler avec une ligne comme std::cout << un_complex; :
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
Si je place l'implémentation dans le corp de ma classe, ça fonctionne.

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.