Bonjour,
Je tente de créer un objet qui contient un wostringstream et qui intercepte de fonctionnement de l'opérateur << :
Malheureusement, aucun de mes fichiers utilisateur ne voit 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
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)...
Partager