Bonjour,
Je tente de créer un objet qui contient un wostringstream et qui intercepte de fonctionnement de l'opérateur << :

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
/*
Classe CDebugWithIndent:
	Cette classe sert à déboguer.
*/
#ifndef CDEBUGWITHINDENT_HPP_INCLUS
#define CDEBUGWITHINDENT_HPP_INCLUS
 
#include <iostream>
#include <string>
#include <sstream>
 
namespace NsFredUtil
{
 
class CDebugWithIndent
{
//////////////////////////////// L'opérateur est déclaré ici ///////////////////
//--- Fonctions amies ---
	template< class T >
	friend CDebugWithIndent & operator <<(
	 CDebugWithIndent &rDwi,	//[in] Objet CDebugWithIndent dans lequel écrire
	 T const &rcDonnee	//[in] Donnée à écrire
	 );
 
//--- Variables de classe ---
private:
//--- Variables d'instance ---
protected:
	size_t m_nIndent;
	std::wostringstream m_ossW;
 
//--- Constructeurs et destructeur ---
protected:
	//Constructeur
	//[inline]
	CDebugWithIndent(
	 void
	 ) : m_nIndent(0)
		{
		//Rien.
		}
	//Destructeur virtuel
	//[inline]
	virtual ~CDebugWithIndent(void)
		{
		//Rien.
		}
 
//--- Méthodes de classe ---
public:
//--- Méthodes d'instance ---
protected:
	//Réaction à l'opération d'insertion de flux
	//[virtuelle]
	virtual void v_InsertionFlux(void);
 
//--- Opérateurs ---
public:
	//Opérateur pour incrémenter le niveau d'indentation (préfixe)
	//[non-virtuelle + NULL-safe]
	//[inline]
	CDebugWithIndent & operator ++ (void)
		{
		if(this != NULL)
			m_nIndent++;
		return *this;
		}
	//Opérateur pour incrémenter le niveau d'indentation (postfixe)
	//[non-virtuelle + NULL-safe]
	//[inline]
	void operator ++ (int)
		{
		if(this != NULL)
			m_nIndent++;
		}
	//Opérateur pour décrémenter le niveau d'indentation (préfixe)
	//[non-virtuelle + NULL-safe]
	//[inline]
	CDebugWithIndent & operator -- (void)
		{
		if(this != NULL && m_nIndent > 0)
			m_nIndent--;
		return *this;
		}
	//Opérateur pour décrémenter le niveau d'indentation (postfixe)
	//[non-virtuelle + NULL-safe]
	//[inline]
	void operator -- (int)
		{
		if(this != NULL && m_nIndent > 0)
			m_nIndent--;
		}
};
 
 
//--- Fonctions templates ---
 
/* Opérateur d'insertion de flux
   ----------------------------- */
template< class T >
NsFredUtil::CDebugWithIndent & operator <<(
 NsFredUtil::CDebugWithIndent &rDwi,	//[in] Objet CDebugWithIndent dans lequel écrire
 T const &rcDonnee	//[in] Donnée à écrire
 )
{
if(this != NULL)
	{
	m_ossW << rcDonnee;
	v_InsertionFlux();
	}
return *this;
}
 
}//namespace NsFredUtil
 
#endif// ! CDEBUGWITHINDENT_HPP_INCLUS
Malheureusement, aucun de mes fichiers utilisateur ne voit l'opérateur!
Et ce, qu'il soit défini dans la classe ou en friend.

Les opérateurs template seraient-ils interdits? Pourtant, quand le compilo examine la classe elle-même, je n'ai aucune erreur, aucun avertissement, et pourtant je suis en Warning level 4 (le maximum sur Visual 2005)...