Tri d'une liste avec un foncteur

Tri d'une liste avec un foncteur - C++ - Programmation

Marsh Posté le 10-02-2005 à 17:02:10    

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 !

Reply

Marsh Posté le 10-02-2005 à 17:02:10   

Reply

Marsh Posté le 10-02-2005 à 18:42:41    

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.

Reply

Marsh Posté le 10-02-2005 à 18:54:24    

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 !

Reply

Marsh Posté le 10-02-2005 à 18:59:34    

et les const :o

Reply

Marsh Posté le 10-02-2005 à 19:03:03    

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

Reply

Marsh Posté le 10-02-2005 à 19:04:28    

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 :)

Reply

Marsh Posté le 10-02-2005 à 19:07:22    

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

Reply

Marsh Posté le 10-02-2005 à 19:15:22    

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.

Reply

Marsh Posté le 10-02-2005 à 21:01:56    

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. };

Reply

Marsh Posté le 10-02-2005 à 21:41:31    

greater<Article *> ...

Reply

Marsh Posté le 10-02-2005 à 21:41:31   

Reply

Marsh Posté le 11-02-2005 à 08:39:08    

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.

Reply

Marsh Posté le 11-02-2005 à 08:50:20    

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 ?
 
 

Reply

Marsh Posté le 11-02-2005 à 08:54:13    

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 !

Reply

Marsh Posté le 11-02-2005 à 08:59:58    

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.

Reply

Marsh Posté le 11-02-2005 à 09:31:51    

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

Reply

Marsh Posté le 11-02-2005 à 09:33:31    

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

Reply

Marsh Posté le 11-02-2005 à 17:10:55    

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:

Reply

Marsh Posté le 11-02-2005 à 17:33:56    

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

Reply

Sujets relatifs:

Leave a Replay

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