Eh oui, c'est une fonction libre pas une fonction membre - 50ème édition -
Version imprimable
Eh oui, c'est une fonction libre pas une fonction membre - 50ème édition -
Normalement ça marche très bien en la déclarant DANS la classe.
De toute façon que je la déclare dans le .h (dans ma classe ou non) ou dans le .cpp, ca ne change rien, le compilateur me dit toujours :
error C2804: binary 'operator <<' has too many parameters
Normalement, oui, mais pour toi, non.
(qu'est-ce que vous voulez répondre d'autre à ça ? :? )
Je ne sais pas, on lui dit et on lui répète que c'est une fonction libre et non une fonction membre, il ya un exemple dans la FAQ et tout et tout, et il persiste à la laisser dans la classe. C'est pourtant une fonction qu'on appelle comme ça :Citation:
Envoyé par Médinoc
Et pasCode:cout << instance
!Code:instance.operator<<(cout)
Bon alors, j'ai déclaré la surcharge dans un fichier totalement indépendant.
Et pour changer j'obtiens une erreur :
Code:
1
2
3 error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'const class std::basic_string<char,struct std::char_traits<char>,class st d::allocator<char> >' (or there is no acceptable conversion)
P.S. : moi c'est ELLE et non IL ;)
Ah, OK ;)
Comment ça se fait qu'il demande un const std::...... ?
Normalement, tu devrais avoir dans ta fonction operator<< des appels aux accesseurs des variables.
Ensuite, c'est std::ostream&
Ok mam'zelle !
bon et bien tu as essayé en rajoutant dans le .h de destinataire
ostream& operator << (ostream & fluxSortie, const Destinataire &dest);
et apres le }; de fin de ta classe, en plus
la definition des fonction mets-les dans un fichier a part (operator.cpp par ex), c'est une fonction libre donc pas DANS la classe !, rajoute juste operator.o a la compile (dans ton makefile par ex)
Mes assesseurs sont déclarés comme cela:
const std::string get_matricule() const;
Serait-ce cela qui pose problème???
Je crois bien oui... ;)
C'est possible si tu met ....const Destinataire &dest); pour la surcharge... enfin je crois, mais essaye dans un fichier a part !ou n'importe ou mais pas DANS la definition de la classe.Citation:
Envoyé par Sachiel31
Essaie plutôt de faire des const std::string& en type de retour.
Ca ne change rien :(
Citation:
Envoyé par Sachiel31
L'erreur a changé ou pas ?
Non j'ai toujours la meme erreur :
Code:
1
2
3 error C2679: binary '<<' : no operator defined which takes a right-hand operand of type 'const class std::basic_string<char,struct std::char_traits<char>,class st d::allocator<char> >' (or there is no acceptable conversion)
Tu as mis la référence comme je te l'ai proposée ?
Tu peux mettre tout le code stp? LA dernière version ?
Qu'on s'y retrouve un peu. ;)
Merci
Alors, voila mon code à l'état actuel.
destinataire.h :
operateur.cppCode:
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 #ifndef _DESTINATAIRE_H_ #define _DESTINATAIRE_H_ #include <string> #include <iostream> #include <ostream> class Destinataire { private: std::string matricule; std::string libelleCptD; std::string nomBanqueD; std::string codeGD; std::string numCptD; std::string paieNet; std::string libelle; std::string codeBD; public: Destinataire(); void afficheD(int n); const std::string& get_matricule() const; void set_matricule(std::string value); const std::string& get_libelleCptD() const; void set_libelleCptD(std::string value); const std::string& get_nomBanqueD() const; void set_nomBanqueD(std::string value); const std::string& get_codeGD() const; void set_codeGD(std::string value); const std::string& get_numCptD() const; void set_numCptD(std::string value); const std::string& get_paieNet() const; void set_paieNet(std::string value); const std::string& get_libelle() const; void set_libelle(std::string value); const std::string& get_codeBD() const; void set_codeBD(std::string value); }; #endif // _DESTINATAIRE_H_
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 #include <iostream> #include <ostream> #include <string> #include "definitions.h" #include "bordereau.h" #include "destinataire.h" #include "emetteur.h" // surcharge de l'operateur << std::ostream& operator<< (ostream &os, const Destinataire &dest){ os << dest.get_matricule() << endl; os << dest.get_libelleCptD() << std::endl; os << dest.get_nomBanqueD() << std::endl; os << dest.get_codeGD() << std::endl; os << dest.get_numCptD() << std::endl; os << dest.get_paieNet() << std::endl; os << dest.get_libelle() << std::endl; os << dest.get_codeBD() << std::endl; return os; };
Il n'y a pas de ; a la fin du code de la surcharge et tu n'a pas mis :
ostream& operator << (ostream & fluxSortie, const Destinataire &dest);
entre le }; et le #endif de destinataire.h
Moi je préfère la déclaration en friend, mais bon c'est toi qui voit.
En plus des remarques de SnakemaN, il te manque unstd::ostream ;)
Pour le ; c'est moi qui me suis craquée dans le post :mrgreen:
Quand je fais ce que tu me dis SnakemaN (rajouter "std::ostream& operator<< (ostream &os, const Destinataire &dest);" dans destinataire.h
), j'ai 3 nouvelles erreurs :
Code:
1
2
3
4
5
6
7
8 destinataire.h(65) : error C2061: syntax error : identifier 'ostream' destinataire.h(65) : error C2809: 'operator <<' has no formal parameters operateur.cpp(28) : error C2440: 'return' : cannot convert from 'class ostream' to 'class std::basic_ostream<char,struct std::char_traits<char> > &' A reference that is not to 'const' cannot be bound to a non-lvalue