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
Je viens de te donner la réponse à ta première erreur :roll:
Tu as oublié un std:: devant le second ostream.
HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA !!!!!!!!!!!!!!
Ca a compilé nickel :yaisse2:
Me reste plus qu'à tester l'affichage de mon vector (j'ai quand meme fait tout ça pour y arriver)
Merciiiiiiiiiiiiiiiiiiiiiiiii :love:
Ouf !
Si ça fonctionne, n'oublies pas le bouton 'Résolu' ;)
Pas encore, ça, c'était pour voir ce qui ne marchait pas dans la première question ;)
Je vais pas vous lacher aussi facilement :P
L'affichage ne marche pas.
Je met tout au clair.
Voici bordereau.h :
c'est lui qui contient mon vector de Destinatire.
Voici ma fonction d'affichage :Code:
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 class Bordereau { private: std::string date; std::string devise; std::string montantTotal; public: std::vector<Destinataire> conteneurDest; std::vector<Destinataire>::iterator itDest; std::vector<Emetteur> conteneurEm; std::vector<Emetteur>::iterator itEm; Emetteur theEmetteur; Destinataire theDestinataire; Bordereau(); void afficheB(); const std::string get_date() const; void set_date(std::string value); const std::string get_devise() const; void set_devise(std::string value); const std::string get_montantTotal() const; void set_montantTotal(std::string value); void afficheConteneurDest(); friend std::ostream& operator<< (std::ostream &os, const Destinataire &dest); };
Et maintenant l'erreur obtenue sur le cout :Code:
1
2
3
4
5 void Bordereau::afficheConteneurDest(){ for(int i = 0; i < conteneurDest.size(); i ++){ cout << conteneurDest[i]; } }
Code:
1
2
3 Bordereau.cpp(6) : error C2678: binary '<<' : no operator defined which takes a left-hand operand of type 'class ostream_withassign' (or there is no acceptable conversion)
Le friend est inutile puisque tu utilises des accesseurs, quoiqu'en dise Poukill... - en plus ça aurait un sens si tu mettais ce friend dans la classe Destinataire, pas là ;) -
Tu inclus bien l'en-tête de ta fonction dans ton fichier cpp ? et l'en-tête iostream ?
Oui oui c'est bon.
Pourquoi iln'y a pas de std:: devant le premier endl de la premiere ligne du code de la surcharge ?
Et pourquoi l'opérateur << est toujours défini dans la classe Bordereau ?
Il est déclaré friend dans Boredereau, c'est tout, c'est ce que j'ai indiqué.
C'est quel compilateur ?
le "std::" c'es parceque je l'ai oublié et l'operateur n'est plus dans bordereau.h
parceque qu'elle veut le mettre en "friend" et qu'elle n'ecoute pô ce qu'on lui dit ! :lol: (j'deconne)
Alors le
friend std::ostream& operator<< (std::ostream &os, const Destinataire &dest);
est dedans (en public de preference)
ou
std::ostream& operator<< (std::ostream &os, const Destinataire &dest);
est APRES le }; de la classe
c'est pareil
J'utilise Visual C++ 6.0
et ça ne change rien que je mette la déclaration de mon operateur dans la classe (avec friend) ou endehors, ou carément pas du tout dans bordereau.h
j'ai toujours la meme erreur :
error C2678: binary '<<' : no operator defined which takes a left-hand operand of type 'class ostream_withassign' (or there is no acceptable conversion)
Probablement une question bête : dans le fichier cpp qui contiens ta fonction d'affichage, tu as bien un using namespace std; ?
en principe d'apres ce que j'ai vu elle rajoute std:: devant tout alors....:lol:Citation:
Envoyé par Eusebe
en plus afficheConteneurDest() est u methode donc le using namespace std devrait etre fait AVANT la declaration de la classe au cas ou on l'utilise..
[edit]: a ben voila il manque std::void afficheConteneurDest();
[edit2]: Sasa montre-nous les <include> que tu utilise dans Bordereau.h
Re [B]HAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA !!!!!!!!!!!!![/B]
Tout marche nickel. J'ai rien changé mais c'est pas grave. C'est un miracle de l'informatique :mouarf:
L'affichage de mon vector marche et son remplissage aussi :king:
Je vous remercie tous beaucoup beaucoup, ce soir je vais enfin pouvoir dormir sans réver des erreurs de mon code. :merci:
Tu n'as rien changé ? Etonnant... :roll:
Mais bon, le principal c'est que ça fonctionne ;)
Bonne nuit alors !
De rien :D
bonne nuit (tu en a manifestement un peu besoin...:mouarf: )
a- C'est une certitude, il sera invalidé. Qui plus est, c'est une initialisation des plus étranges que je ne vois pas trop ce qu'elle peut faire. Avec un peu de chance, le container est vide, du coup on ne rentre pas dans la boucle et la mémoire n'est pas mise sans dessus-dessous.Citation:
Envoyé par Eusebe
b- Pour initialiser ? S'il n'y a pas un constructeur spécialisé pour cela, il y std::fill et std::fill_n
PS: <iostream> seulement là où l'on se sert de std::cout, std::cin, std::cerr ou std::clog. Il suffit de <iosfwd> pour les déclarations en avant dans les .h (où il n'y a pas de code, n'est-ce pas ? ^^) Et <istream>/<ostream> là on l'on définit du code qui a besoin des définitions des classes de flux.