pointer_to_unary_function, random_shuffle & gcc 3.3

pointer_to_unary_function, random_shuffle & gcc 3.3 - C++ - Programmation

Marsh Posté le 19-01-2005 à 11:26:58    

Salut à tous,
 
j'ai un problème avec pointer_to_unary_function :
Avec VC7, pas de problème mais avec gcc 3.3, j'ai une erreur à la compilation :

Code :
  1. toto.cpp:21: error: invalid initialization of non-const reference of type '
  2.    std::pointer_to_unary_function<int, int>&' from a temporary of type '
  3.    std::pointer_to_unary_function<int, int>'
  4. /usr/include/c++/3.3/bits/stl_algo.h:1666: error: in passing argument 3 of `
  5.    void std::random_shuffle(_RandomAccessIter, _RandomAccessIter,
  6.    _RandomNumberGenerator& ) [with _RandomAccessIter =
  7.    __gnu_cxx::__normal_iterator<int*, std::vector<int, std::allocator<int> > >,
  8.    _RandomNumberGenerator = std::pointer_to_unary_function<int, int>]'


j'avoue ne pas comprendre, pourtant ça doit être gros comme une maison mais avec le nez dans le guidon, pas facile  :sleep:  
 

Code :
  1. #include <vector>
  2. #include <functional>
  3. #include <algorithm>
  4. int Rand( int a ) {
  5. return a; // juste pour l'exemple
  6. }
  7. int main() {
  8. std::vector<int> a;
  9. a.push_back( 1 );
  10. a.push_back( 2 );
  11. a.push_back( 3 );
  12. a.push_back( 4 );
  13. a.push_back( 5 );
  14. std::random_shuffle(
  15. a.begin(),
  16. a.end(),
  17. std::pointer_to_unary_function<int, int>(Rand)
  18. );
  19. return 0;
  20. }


Reply

Marsh Posté le 19-01-2005 à 11:26:58   

Reply

Marsh Posté le 19-01-2005 à 11:35:23    

Le 3ème argument de random_shuffle (comme beaucoup d'argument d'algos STL) est non-const. Tu ne peux donc pas lui passer un référence vers un objet temporaire à moins de gruger.
 
Je te conseille donc d'augmenter ta productivité en écrivant plus de lignes de code:

Code :
  1. std::pointer_to_unary_function<int, int>  p(Rand);
  2. std::random_shuffle(
  3. a.begin(),
  4. a.end(),
  5. p
  6. );


Reply

Marsh Posté le 19-01-2005 à 11:53:54    

Arf... c'était effectivement tout simple...  :cry: je vais aller dormir un peu moi  :pt1cable:  
 
Merci,
Tyrion qui devrait consulter les protos des fonctions de temps en temps

Reply

Marsh Posté le 22-01-2005 à 09:53:38    

Lam's a écrit :

Le 3ème argument de random_shuffle (comme beaucoup d'argument d'algos STL) est non-const. Tu ne peux donc pas lui passer un référence vers un objet temporaire à moins de gruger.
 
Je te conseille donc d'augmenter ta productivité en écrivant plus de lignes de code:

Code :
  1. std::pointer_to_unary_function<int, int>  p(Rand);
  2. std::random_shuffle(
  3. a.begin(),
  4. a.end(),
  5. p
  6. );



 
Et pourquoi on ne pourrait pas ? Je vois pas ce que ca peut changer qu'il soit const ou pas. Il y a surement un truc qui m'a echappé.

Reply

Marsh Posté le 24-01-2005 à 23:07:38    

up
svp

Reply

Marsh Posté le 24-01-2005 à 23:45:16    


 
ça revient à ça :
 

Code :
  1. class Foo{};
  2. int main
  3. {
  4.     Foo& x = Foo(); //pas bon, on pourrait modifier un objet qui n'existe plus ...
  5.     const Foo& y = Foo(); //OK
  6. }


 

Reply

Marsh Posté le 25-01-2005 à 20:52:15    

si il n'existe plus, alors certes on ne peut pas le modifier, mais on ne peut pas le lire non plus, donc je vois pas ce que change le const

Reply

Marsh Posté le 27-01-2005 à 00:10:45    

Je me rique à suggérer que le problème vient de l'ordre de la construction de l'objet std::pointer_to_unary_function<int, int>. Lors de l'appel de la fonction std::random_shuffle, il n'est pas dit que la construction a été complétée (sur la pile), du fait que l'ordre est dépendant de l'implémentation.


Message édité par el muchacho le 27-01-2005 à 00:12:56
Reply

Marsh Posté le 31-01-2005 à 19:25:44    

peut etre mais je pense que c'est pas le probleme ici puisqu'apparemment ca compile avec un const et ca ne compile pas avec un non const. ou alors l'ordre dépend de la constness du truc mais ca m'etonnerait
 
de plus l'exemple de ++fab trois posts plus haut ne fait pas d'appel de fonction, il ne fait qu'initialiser une référence.

Reply

Sujets relatifs:

Leave a Replay

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