[C++] qsort() sur des templates - problème de compilation (mauvais type)

Bonsoir,

Dans ma classe Map, j’ai une méthode de tri (pour trier un tableau de taille fixe connue) dont voici le code :

template <typename Enreg>
void Map<Enreg>::_tri(void) {
	// http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_qsort.asp
	qsort(
  (void *)this->Liste, // Le tableau contenant des MapModule<Enreg>
  this->nb_enreg, // Le nombre de cellules du tableau
  this->sizeof_MapModule, // La taille d'un MapModule<Enreg> (obtenue avec sizeof())
  Map_comparaison_croissant<Enreg> // Ma fonction de tri
	);
}

Et la fonction de tri est :

template <typename Enreg>
int Map_comparaison_croissant(const void *element1, const void *element2) {
	return strcmp((*(MapModule<Enreg>*)element1).get_cle(), (*(MapModule<Enreg>*)element2).get_cle());
}

Et là où j’ai un problème c’est que Visual C++ 6.0 me dit :[quote=""]
classes-map.h(192) : error C2664: ‘qsort’ : cannot convert parameter 4 from ‘int (const void *,const void *)’ to ‘int (__cdecl *)(const void *,const void *)’
[/quote]
J’ai bien essayé de mettre, à tout hasard, (__cdecl *) (un cast) devant le 4ème argument de qsort (“Map_comparaison_croissant<Enreg>”), mais il me sort un : syntax error : ‘__cdecl’.

J’ai fait des tests et j’arrive à faire fonctionner un qsort tant que la fonction de comparaison n’est pas sur un type générique.
Est-ce peine perdue ?

de ce que je pige, ton erreur se situe dans le fichier classes-map.h ligne 192, pas dans ton code C?

:hello:
programmeur en Java et C, ne pas tenir compte de ce que je dit si c’est nimp.

  1. Tu as mis du code dans ton .h au lieu du .cpp? c’zest pour ça que tu as l’erreur dans le .h? bref, ça résoud pas le prob :smiley:
  2. Il n’y a pas d’autre méthode de tri que les pointeur de fonction en objet?. En java, on passe en paramètre un objet qui hérite de Comparator et boum ça roule.
  3. connaît pas la syntaxe des pointeurs de fonctions en C++ , mais tu est sûr qu’il faut le <Enreg> pour “Map_comparaison_croissant<Enreg>”, j’écrirais bien Map_comparaison_croissant tout court en paramètre du qsort. :neutre:
    edit: en objet, on utilise les STL, et je n’ai rien compris :smiley:
    http://www.sgi.com/tech/stl/table_of_contents.html

template <typename Enreg>
static int Map_comparaison_croissant(const void *element1, const void *element2) {
return strcmp((*(MapModule<Enreg>*)element1).get_cle(), (*(MapModule<Enreg>*)element2).get_cle());
}

Sans-Nom & deltree > Oui, templates obligent, j’ai mis tout le code C dans le .h

deltree > Si je mets “Map_comparaison_croissant” à la place de “Map_comparaison_croissant<Enreg>”, j’ai le même message d’erreur :frowning:

KarLKoX > Si j’ai bien vu, tu as rajouté “static” devant ? Ca me sort le même message :frowning:

Bizzare, j’ai pourtant eu le même problème (pas sur une template, certe) et le static réglais le problème.
Tu as la méthode barbare, faire un extern “C” du prototype de qsort voire carrément de rendre extern “C” la template fonction utilisant qsort :paf:
Ultime recours, paramettrer ton ide pour exporter les fonctions en _cdecl.

Comment et où faire un extern "C" ?

On me conseille d’utiliser std::sort().

Y pas moyen d’avoir le code complet ? Que je puisse sortir ma hache de barbare :paf: