Surcharge d'opérateur

Surcharge d'opérateur - C++ - Programmation

Marsh Posté le 11-11-2006 à 12:52:50    

Bonjour,
 
J'ai ce code qui n'est pas une fonction membre de ma classe number :

Code :
  1. ostream &operator<<(ostream &a, number b)
  2. {
  3. a<<b.nbr;
  4. return a;
  5. }

Ce code fonctionne parfaitement
 
 
Par contre si j'esseye de faire une surcharge de << avec une fonction membre de number, ça ne fonctionne pas, pourquoi ?

Code :
  1. ostream &number::operator<<(ostream &a)
  2. {
  3. a<<nbr;
  4. return a;
  5. }


Merci...
 
EDIT: en fait ça compile bien sauf quand je met le cout:  
number a;
cout<<a;


Message édité par casafa le 11-11-2006 à 13:02:30
Reply

Marsh Posté le 11-11-2006 à 12:52:50   

Reply

Marsh Posté le 11-11-2006 à 13:09:13    

tu n'as pas oublié le using ou les std::cout ?


---------------
Instagram - Mon PVT en Australie.
Reply

Marsh Posté le 11-11-2006 à 13:14:12    

Non, j'ai fait un using namespace std.
 
Voici une partie des erreurs retournées par le compilateur:

Citation :

$ g++ surcharge.cpp
surcharge.cpp: In function 'int main()':
surcharge.cpp:109: error: no match for 'operator<<' in 'std::cout << a'
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:67: note: candidates are: std::basic_ostream<_CharT                                                                , _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ostream<_CharT, _Traits>& (*)(std::basic_ostream<_CharT, _Tra                                                                its>& )) [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:78: note:                 std::basic_ostream<_CharT                                                                , _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>& ))                                                                 [with _CharT = char, _Traits = std::char_traits<char>]
/usr/lib/gcc/i486-linux-gnu/4.1.2/../../../../include/c++/4.1.2/bits/ostream.tcc:90: note:                 std::basic_ostream<_CharT                                                                , _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(std::ios_base& (*)(std::ios_base& )) [with _CharT = char, _Traits = std::                                                                char_traits<char>]


Message édité par casafa le 11-11-2006 à 13:27:53
Reply

Marsh Posté le 11-11-2006 à 13:42:09    

Je viens de lire que cout<<a; correspondait à ceci : cout.operator<<(a) ce qui expliquerai que mon cout<<a; ne fonctionnerait pas.
 
Mais alors quand est ce que cette fonction membre pourrait être appellé ?

Code :
  1. ostream &number::operator<<(ostream &a)
  2. {
  3.     a<<nbr;
  4.     return a;
  5. }

Reply

Marsh Posté le 12-11-2006 à 11:49:05    

c'est à l'envers !
tu devrais faire  
 
ostream &ostream::operator<<(number &a);
 
mais comme une classe (ici ofstream) est fermée (contrairement aux namespace qui sont ouverts) tu dois passer par une fonction mise dans le namespace std.
 

Code :
  1. namespace std
  2. {
  3.    ostream& operator<<(ostream& a, const number& b)
  4.    {
  5.        return a << b.nbr;
  6.    }
  7. }


 
edit : et passe number b par const-référence !


Message édité par jesus_christ le 12-11-2006 à 11:51:00
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed