Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1292 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Tri d'une liste avec un foncteur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Tri d'une liste avec un foncteur

n°977839
nathan_g
Posté le 10-02-2005 à 17:02:10  profilanswer
 

Bonjour,
 
j'essaye de trier une liste de pointeurs sur des objets Article avec un foncteur (ce qui doit être la seule possibilté). Malheureusement, à la compilation, j'ai le message suivant :
 

Code :
  1. Compiling...
  2. main2.cpp
  3. E:\monchemin\main.cpp(59) : error C2664: 'void __thiscall std::list<class Article *,class std::allocator<class Article *> >::sort(struct std::greater<class Article *> )' : cannot convert parameter 1 from 'struct Compar' to 'struct std:
  4. :greater<class Article *>'
  5.         No constructor could take the source type, or constructor overload resolution was ambiguous
  6. Error executing cl.exe.


 
Mon programme est le suivant :
 

Code :
  1. #include <list>
  2. #include <iostream>
  3. using namespace std;
  4. class Article
  5. {
  6. public:
  7.   Article() {}
  8.   double prix()
  9.     {
  10.       return (_prix);
  11.     }
  12.   void new_prix(double _new_prix)
  13.     {
  14.       _prix = _new_prix;
  15.     }
  16. protected:
  17.   double _prix;
  18. };
  19. struct Compar
  20. {
  21.   bool operator()(Article* left,Article* right)
  22.     {
  23.       return ((left->prix())<(right->prix()));
  24.     }
  25. };
  26. int main()
  27. {
  28.   int i;
  29.   Article* art;
  30.   list<Article*> list_art;
  31.   list<Article*>::iterator it;
  32.   for(i=0;i<5;i++)
  33.     {
  34.       art = new Article;
  35.       art->new_prix(rand()%10);
  36.       list_art.push_back(art);
  37.     }
  38.    
  39.   for(it=list_art.begin();it!=list_art.end();it++)
  40.     {
  41.       cout << (*it)->prix() << endl;
  42.     }
  43.   list_art.sort(Compar()); 
  44.   for(it=list_art.begin();it!=list_art.end();it++)
  45.     {
  46.       cout << (*it)->prix() << endl;
  47.     }
  48. return (1);
  49. }


 
Sauriez vous d'où provient mon problème ? Je travaille avec Visual C++ 6.0 ce qui peut aussi générer des erreurs avec la STL je crois !
 
Merci d'avance de votre aide !

mood
Publicité
Posté le 10-02-2005 à 17:02:10  profilanswer
 

n°977914
Tarabiscot​e
Posté le 10-02-2005 à 18:42:41  profilanswer
 

Déjà je peux te dire qu'il n'y a pas de prob à la compilation avec g++ et le programme s'exécute correctement.

n°977917
nathan_g
Posté le 10-02-2005 à 18:54:24  profilanswer
 

M...
C'est surement encore un problème avec Visual C++ 6.0 !
Mais si quelqu'un a une solution pour résoudre ce problème sous ce compilateur, je suis preneur !

n°977920
Taz
bisounours-codeur
Posté le 10-02-2005 à 18:59:34  profilanswer
 

et les const :o

n°977921
Tarabiscot​e
Posté le 10-02-2005 à 19:03:03  profilanswer
 

C'est sur c'est mieux de mettre les const mais peut-etre qu'il veut aussi que le foncteur hérite de greater.

n°977922
Davy_D
Posté le 10-02-2005 à 19:04:28  profilanswer
 

Un air de deja vu pour moi ...  L'utilisation avancée de la STL(foncteur notemment) avec Visual 6 je n'ai jamais pu en faire quelque chose...
 
Sur le 2003 tout marche parfaitement :)

n°977925
Taz
bisounours-codeur
Posté le 10-02-2005 à 19:07:22  profilanswer
 

les const pitié
 
bool operator()(Article* left,Article* right)
 
rien que là il en manque 3

n°977932
lsdYoYo
gravity powered
Posté le 10-02-2005 à 19:15:22  profilanswer
 

Tiens, moi aussi je vais t'aider. En plus des const, ajoute des commentaires. Alors, problème résolu ? Non ? Bizarre...
Pourtant avec des aides aussi utiles que celle de Taz et moi...
Charrue avant les boeufs powered.

n°978008
Tarabiscot​e
Posté le 10-02-2005 à 21:01:56  profilanswer
 

Essaye ca je pense que ca devrait marcher :
 

Code :
  1. class Article
  2. {
  3. public:
  4.   Article() {}
  5.   double prix() const
  6.     {
  7.       return (_prix);
  8.     }
  9.   void new_prix(double _new_prix)
  10.     {
  11.       _prix = _new_prix;
  12.     }
  13. protected:
  14.   double _prix;
  15. };
  16. struct Compar : greater<Article *>
  17. {
  18.   bool operator()(const Article* left,const Article* right) const
  19.     {
  20.       return ((left->prix())<(right->prix()));
  21.     }
  22. };

n°978029
Taz
bisounours-codeur
Posté le 10-02-2005 à 21:41:31  profilanswer
 

greater<Article *> ...

mood
Publicité
Posté le 10-02-2005 à 21:41:31  profilanswer
 

n°978218
nathan_g
Posté le 11-02-2005 à 08:39:08  profilanswer
 

Merci de votre aide ...
Effectivement, il est possible que ces questions ait un air de déja vu car je suis souvent venu sur ce forum pour mes problèmes d'utilisation de la STL avec Visual C++ 6.0 (sans que cela ait souvent résolu le problème tant l'utilisation de cette librairie sous V6.0 est problématique !).
 
Pour Taz, effectivement il doit manquer quelque const. J'avais essayé d'être plus rigoureux dans la définition de operator() mais cela n'avait pas amélioré la compilation. Il est vrai que sans les utiliser, le programme marche quand même sous g++ (ce qui ne justifie en rien de ne pas en mettre !).
 
En tout cas, un grand merci pour ces conseils, je vais essayer de voir si cela résoud mon problème.

n°978220
nathan_g
Posté le 11-02-2005 à 08:50:20  profilanswer
 

Euh ..
 
Effectivement, le programme suivant compile (j'ai juste rajouté le remplissage de la liste et l'appel à Compar) :
 

Code :
  1. #include <list>
  2. #include <iostream>
  3. using namespace std;
  4. class Article 
  5. public
  6.   Article() {} 
  7.   double prix() const
  8.     { 
  9.       return (_prix); 
  10.     } 
  11.   void new_prix(double _new_prix) 
  12.     { 
  13.       _prix = _new_prix; 
  14.     } 
  15. protected
  16.   double _prix; 
  17. }; 
  18. struct Compar : greater<Article *>
  19.   bool operator()(const Article* left,const Article* right) const
  20.     { 
  21.       return ((left->prix())<(right->prix())); 
  22.     } 
  23. };
  24. int main()
  25. {
  26.   int i;
  27.   Article* art;
  28.   list<Article*> list_art;
  29.   list<Article*>::iterator it;
  30.   for(i=0;i<5;i++)
  31.     {
  32.       art = new Article;
  33.       art->new_prix(rand()%10);
  34.       list_art.push_back(art);
  35.     }
  36.    
  37.   for(it=list_art.begin();it!=list_art.end();it++)
  38.     {
  39.       cout << (*it)->prix() << endl;
  40.     }
  41.   list_art.sort(Compar());
  42.   for(it=list_art.begin();it!=list_art.end();it++)
  43.     {
  44.       cout << (*it)->prix() << endl;
  45.     }
  46. return (1);
  47. }


 
Mais, bizarrement, il ne réalise pas un tri de la liste mais juste son inversion !
 
En l'occurence, partant de :
 

Code :
  1. 1
  2. 7
  3. 4
  4. 0
  5. 9


 
J'obtiens :
 

Code :
  1. 9
  2. 0
  3. 4
  4. 7
  5. 1


 
Quelqu'un saurait-il d'où vient le problème ?
 
 

n°978225
nathan_g
Posté le 11-02-2005 à 08:54:13  profilanswer
 

De mieux en mieux, je viens de tester ce programme sous gcc et il marche parfaitement. Le tri est réalisé sans que cela corresponde à l'inversion de l'ordre des éléments dans la liste !

n°978226
Tarabiscot​e
Posté le 11-02-2005 à 08:59:58  profilanswer
 

Taz a écrit :

greater<Article *> ...


C'est vrai que ça peut paraître bizarre mais VC++6 semble le réclamer donc ...
 
Sinon faudrait regarder dans la STL de VC++6 comment est déclarer greater, il faut peut être surdéfinir une de ses fonctions.

n°978246
Joel F
Real men use unique_ptr
Posté le 11-02-2005 à 09:31:51  profilanswer
 

ben on telecharge une STL rogue wave et zou, la stl de wc++ 6.0 on en parle plus.

n°978249
Taz
bisounours-codeur
Posté le 11-02-2005 à 09:33:31  profilanswer
 

j'ai pas dit que c'était bizarre, j'ai dit 'const un jour, const toujours' :o

n°979011
Tarabiscot​e
Posté le 11-02-2005 à 17:10:55  profilanswer
 

Tu veux dire greater<const Article *> :??:  
 
Ben en tout cas avec g++ ça a pas l'air d'être le cas vu qu'il le rajoute lui même ...
 

Code :
  1. template <class _Tp>
  2.     struct greater : public binary_function<_Tp, _Tp, bool>
  3.     {
  4.       bool
  5.       operator()(const _Tp& __x, const _Tp& __y) const
  6.       { return __x > __y; }
  7.     };


 
Enfin je peux me tromper  :jap:

n°979028
Taz
bisounours-codeur
Posté le 11-02-2005 à 17:33:56  profilanswer
 

désolé, des fois j'ai du mal, dans STL c'est souvent le bordel pour savoir si la constness est portée par le type ou pas ... vive les traits


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Tri d'une liste avec un foncteur

 

Sujets relatifs
inversion de liste chainehelp php liste déroulante via mysql
liste déroulante affichage automatiquePHP/MySQL: liste déroulante, affichage automatique
[C] Tri par insertionliste horizontale sur plusieurs lignes en CSS ?
Gestion de liste V2 vous pouvez revenir tout casser :Drequête paramétrée et liste déroulante
[mysql] Commande pour avoir la liste des base de donnéeliste deroulante dynamique PHP/Javascript
Plus de sujets relatifs à : Tri d'une liste avec un foncteur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR