Probleme de passage de fonction a list::sort

horkko -  
 horkko -
Bonjour,

Je suis tout nouveau dans le monde du C++.
Mon probleme est que j'aimerais passer une fonction de tri supplementaire a la fonciton list::sort() au niveau d'une list contenant des objets.
Pour ce faire j'ai lu et reproduit ce qui etait indique dans la doc suivante :

http://www.cplusplus.com/reference/list/list/sort/

Comme indique dans cette doc il est possible de passer une autre facon de trier sa liste en passant une fonction a sort().

Pour illustrer mon probleme voici tout d'abord mon erreur

Histogram.cc: In member function 'bool Histogram::_sortByStart()':
Histogram.cc:351: error: no matching function for call to 'std::list<Seq*, std::allocator<Seq*> >::sort(<unresolved overloaded function type>)'
/usr/include/c++/4.2/bits/list.tcc:271: note: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = Seq*, _Alloc = std::allocator<Seq*>]
/usr/include/c++/4.2/bits/list.tcc:348: note: void std::list<_Tp, _Alloc>::sort(_StrictWeakOrdering) [with _StrictWeakOrdering = bool (Histogram::*)(Seq*, Seq*), _Tp = Seq*, _Alloc = std::allocator<Seq*>]


ET le code correspondant :

bool Histogram::_byStart(Seq* s, Seq* e) {
return (s->get_start() < e->get_start());
}


bool Histogram::_sortByStart() {

map<string, list<Seq*> >::iterator it;

for(it = this->_get_Seqs()->begin();
it != this->_get_Seqs()->end();
it++) {

//Don't bother with empty list
if(it->second.empty())
continue;

string id = it->first;
this->_get_Seqs()->find(id)->second.sort(_byStart);
}
this->_seq_sorted = true;
return this->_is_sorted();

}

Si quelqu'un peurt me venir en aide svp, car la je suis bloque et mon projet n'avance plus du tout.

Merci par avance.
A voir également:

1 réponse

Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Salut.
je pense que le problème viens du fait que tu donnes à "sort" une fonction faisant partie de Histogram, alos que dans l'exemple du lien c'est une fonction globale.
Essai avec une fonction globale c'est surement le plus propre. Si tu tiens à conserver une fonction membre essai avec this->_byStart à la place de _byStart, ou alors met la fonction membre en static (ce qui reviens à une fonction globale, mais cela reste dans la classe).
En fait, une fonction membre est une fonction globale qui a un argument invisible qui est this.
"A->B()" donne lors de la compilation "B(&A)"
T A::B(){...} est virtuellement transformé en T B(type_de_A& this){...}.
Ce qui peut expliquer que sort() ne sache pas quoi utiliser.
1
horkko
 
Merci char Snipeur,

J'ai passe la fonction _byStart en static comme tu me l'avais conseille et ca fonctionne parfaitement.
Merci beaucoup pour ce petit coup de pouce et cette lecon de C++ ;)

horkko
0