surcharge de l'operateur >>

surcharge de l'operateur >> - C++ - Programmation

Marsh Posté le 19-10-2006 à 19:36:23    

Bonjour !
   je suis en train de faire un petit programme qui doit être capable d'écrire des structure du type :

Code :
  1. struct CVertex
  2. {
  3.    float x, y, z,
  4.           nx, ny, nz,
  5.           u, v;
  6. };


Bon pour l'écriture pas de soucis : j'ai surchargé l'opérateur << :

Code :
  1. std::ostream &operator<<(std::ostream &f, const CVertex &vertex)
  2. {
  3. return f <<vertex.x << " " << vertex.y << " " << vertex.z << " " << vertex.nx << " " << vertex.ny << " " << vertex.nz << " " << vertex.u << " " << vertex.v << " ";
  4. }


mais pour la lecture j'aurrais voulu surcharger l'operateur >>. Mais, il se trouve que je me suis rendu compte que j'ai jamais vu la surcharge de l'opérateur >>, l'opérateur << on voit ça souvent mais pas dans l'autre sens...
Aussi j'ai essayé de faire ça :

Code :
  1. CVertex &operator>>(std::fstream &f, CVertex &vertex)
  2. {
  3. f >> vertex.x;
  4. f >> vertex.y;
  5. f >> vertex.z;
  6. f >> vertex.nx;
  7. f >> vertex.ny;
  8. f >> vertex.nz;
  9. f >> vertex.u;
  10. f >> vertex.v;
  11. return vertex;
  12. }


Ca a l'air de marcher, mais est-ce que celà vous parrait correct ?
 
Sinon dans mon programme de test, ça marche impécable mais quand je l'intègre dans mon vrai projet, ça marche plus... j'ais les erreurs de lien suivante :

Citation :


error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct CVertex const & )" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABUCVertex@@@Z) already defined in main.obj
 
error LNK2005: "struct CVertex & __cdecl operator>>(class std::basic_fstream<char,struct std::char_traits<char> > &,struct CVertex & )" (??5@YAAAUCVertex@@AAV?$basic_fstream@DU?$char_traits@D@std@@@std@@AAU0@@Z) already defined in main.obj
 
ModelLoader.obj : error LNK2005: "class std::basic_ostream<char,struct std::char_traits<char> > & __cdecl operator<<(class std::basic_ostream<char,struct std::char_traits<char> > &,struct CVertex const & )" (??6@YAAAV?$basic_ostream@DU?$char_traits@D@std@@@std@@AAV01@ABUCVertex@@@Z) already defined in main.obj
 
ModelLoader.obj : error LNK2005: "struct CVertex & __cdecl operator>>(class std::basic_fstream<char,struct std::char_traits<char> > &,struct CVertex & )" (??5@YAAAUCVertex@@AAV?$basic_fstream@DU?$char_traits@D@std@@@std@@AAU0@@Z) already defined in main.obj


 
Bon il a l'air de parler de redéfinition... pourtant ma structure CVertex et la surcharges de ses opérateurs sont bien dans un bloc ifndef/define/endif... Vous auriez une idée ?
 
Merci :)

Reply

Marsh Posté le 19-10-2006 à 19:36:23   

Reply

Marsh Posté le 19-10-2006 à 23:18:27    

CVertex &operator>>(std::fstream &f, CVertex &vertex
 
->
 
std::istream& operator>>(std::istream &, CVertex & );

Reply

Marsh Posté le 19-10-2006 à 23:41:06    

Amonchakai a écrit :

Bon il a l'air de parler de redéfinition... pourtant ma structure CVertex et la surcharges de ses opérateurs sont bien dans un bloc ifndef/define/endif... Vous auriez une idée ?


si la définition le la surcharge de operator>> est dans un header, elle doit être déclaré inline. Sinon, il faut mettre la définition au chaud dans un .cpp -- comme pour n'importe quelle fonction non-template.
(bien sur, le prototype de ton operator>> est suspect)

Reply

Marsh Posté le 20-10-2006 à 06:58:19    

Ok, ça marche Merci a tous !
je me disais bien qu'il y avait un problème avec mon opérateur... Disons que j'ai cherché dans tous mes livres et sur internet et j'avais pas vu d'explication sur la surcharge de cet opérateur... (l'operateur<< oui mais l'autre...). Aussi j'ai essayé ce qu'il ne faut jamais faire en C++ (et qui c'est avéré vrai cette fois ci aussi) bidouiller...
 
   Toujours est-il Merci a tous les deux :)


Message édité par Amonchakai le 20-10-2006 à 07:00:36
Reply

Marsh Posté le 20-10-2006 à 09:05:13    

[:drapal]


---------------
Töp of the plöp
Reply

Sujets relatifs:

Leave a Replay

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