2010-09-03 8 views
1

Je ne peux pas compiler le code suivant par g ++ 4.3.2:std :: random_shuffle, erreur compliler: pas de fonction concordante pour l'appel

 
#include <stdlib.h> 
#include <algorithm> 

struct Generator { 
    ptrdiff_t operator() (ptrdiff_t max) { 
    return rand() % max; 
    } 
}; 

// ... 
Generator generator; 
std::vector<size_t> indices; 
// fill vector 
std::random_shuffle(indices.begin(), indices.end(), generator); // error here! 

Pourquoi mon compilateur jette erreur suivant dans la dernière ligne?

erreur: aucune fonction de mise en correspondance pour l'appel à « random_shuffle (__ gnu_cxx :: __ normal_iterator < unsigned long int *, std :: vecteur < à long unsigned int, std :: allocateur < unsigned long int > > >, __gnu_cxx :: __normal_iterator < unsigned long int *, std :: vecteur < à long unsigned int, std :: allocateur < unsigned long int > > >, Générateur &) »

Merci à l'avance!

Répondre

0

En fait, dans mon code Generator structure est déclarée dans une fonction. Je ne sais pas wjy, mais g ++ 4.3.2 ne l'accepte pas. Après avoir déplacé la déclaration de structure hors fonction, les succès de compilation. Je crois que c'est un bug dans le compilateur. De plus, le code original a été compilé avec succès par une version antérieure de g ++.

+5

Vous ne pouvez pas instancier un modèle avec un type local. 'random_shuffle' est un template de classe, et' Generator' est un type local. C'est pourquoi cela fonctionne si vous déplacez 'Generator' de sorte que ce n'est pas un type local. –

+2

Cela devrait fonctionner avec C++ 11, mais pas C++ 98. –