Précédent   Forum des professionnels en informatique > C et C++ > C++ > Bibliothèques > SL & STL
SL & STL Forum d'entraide C++ sur SL & STL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/02/2012, 09h43   #1
Membre Expert
 
Avatar de ctxnop
 
Homme
Développeur informatique
Inscription : juillet 2007
Messages : 710
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 710
Points : 1 258
Points : 1 258
Envoyer un message via MSN à ctxnop
Par défaut Problème de compilation avec std::list<T>.sort

Bonjour à tous.
C'est certainement parce que je ne suis pas encore très réveillé mais j'ai un petit problème pour trier une liste d'objets. Mon code compile et fonctionne très bien sous Visual Studio 2010, par contre, sous Linux avec g++ 4.5.3 il me sort cette erreur :
Citation:
Envoyé par g++
error: no matching function for call to ‘std::list<CopyOperation>::sort(IBak::StartCopy()::sort_by_size)’
/usr/lib/gcc/x86_64-pc-linux-gnu/4.5.3/include/g++-v4/bits/list.tcc:301:5: note: candidate is: void std::list<_Tp, _Alloc>::sort() [with _Tp = CopyOperation, _Alloc = std::allocator<CopyOperation>]
Voici mon code :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
std::list<CopyOperation> CopyList;
 
// ...
 
// Tri par taille
struct sort_by_size
{
	bool operator() (const CopyOperation& i, const CopyOperation& j) const { return (i.GetFileSize() < j.GetFileSize());}
};
CopyList.sort(sort_by_size());
Qu'ai-je donc écris comme conneries encore ?
ctxnop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 10h59   #2
Membre confirmé
 
Avatar de gb_68
 
Homme
Ingénieur développement logiciels
Inscription : août 2006
Messages : 186
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 28
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Ingénieur développement logiciels
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2006
Messages : 186
Points : 280
Points : 280
Bonjour,

StartCopy()::sort_by_size je ne connais pas trop g++ et cette syntaxe, mais je pense que cela signifie que sort_by_size est local à la fonction StartCopy ?

Si c'est le cas, il n'est pas possible d'utiliser un type local en argument template selon la norme C++2003.
Cette restriction a été levée en C++2011 (et VS2010 doit déjà le permettre).
GCC 4.5 (cf .Local and unnamed types as template arguments : N2657) l'implémente aussi mais il faut peut-être activer la compilation C++2011 pour que cela fonctionne.

Sinon il est aussi possible de sortir la structure de la fonction (pour être compatible C++2003).
gb_68 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 08/02/2012, 11h08   #3
Membre Expert
 
Homme
Junior developer C/C++/Embedded system
Inscription : juin 2010
Messages : 656
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Junior developer C/C++/Embedded system

Informations forums :
Inscription : juin 2010
Messages : 656
Points : 1 371
Points : 1 371
La syntaxe serait pas plutôt
Code :
CopyList.sort(sort_by_size);
?

Edit:
ou plutôt d'après la doc

Code :
1
2
3
4
5
6
7
std::list<CopyOperation> CopyList;
 
// ...
 
// Tri par taille
bool sort_by_size (CopyOperation i, CopyOperation j) { return (i.GetFileSize() < j.GetFileSize());}
CopyList.sort(sort_by_size);
Citation:
Parameters
comp
Comparison function that, taking two values of the same type of those contained in the list object, returns true if the first argument goes before the second argument in the specific order (i.e., if the first is less than the second), and false otherwise.
Bousk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 11h18   #4
Membre Expert
 
Avatar de ctxnop
 
Homme
Développeur informatique
Inscription : juillet 2007
Messages : 710
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 710
Points : 1 258
Points : 1 258
Envoyer un message via MSN à ctxnop
Citation:
Envoyé par gb_68 Voir le message
Bonjour,

StartCopy()::sort_by_size je ne connais pas trop g++ et cette syntaxe, mais je pense que cela signifie que sort_by_size est local à la fonction StartCopy ?

Si c'est le cas, il n'est pas possible d'utiliser un type local en argument template selon la norme C++2003.
Cette restriction a été levée en C++2011 (et VS2010 doit déjà le permettre).
GCC 4.5 (cf .Local and unnamed types as template arguments : N2657) l'implémente aussi mais il faut peut-être activer la compilation C++2011 pour que cela fonctionne.

Sinon il est aussi possible de sortir la structure de la fonction (pour être compatible C++2003).
Je n'ai pas mon linux sous la main pour tester, je testerai ce midi, mais ça m'a bien l'air d'être exactement ça mon problème effectivement

Du coup il faut que je passe l'option -std=c++0x vu que j'ai la version 4.5 de gcc...
C'est sur que je pourrais sortir la structure de la fonction, mais je préfèrerai qu'elle y reste dans le sens où je n'ai pas envie de trimballer des dizaines de mini-structures utiles uniquement à un endroit donné. C'est perturbant dans l'intellisense je trouve
Merci bien de l'info, j'avoue ne pas avoir songé à la norme C++11, étant donnée que le compilo MS est très en retard sur cette norme pour autant que je sache.
ctxnop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 11h26   #5
Membre Expert
 
Avatar de ctxnop
 
Homme
Développeur informatique
Inscription : juillet 2007
Messages : 710
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 710
Points : 1 258
Points : 1 258
Envoyer un message via MSN à ctxnop
Citation:
Envoyé par Bousk Voir le message
La syntaxe serait pas plutôt
Code :
CopyList.sort(sort_by_size);
?

Edit:
ou plutôt d'après la doc

Code :
1
2
3
4
5
6
7
std::list<CopyOperation> CopyList;
 
// ...
 
// Tri par taille
bool sort_by_size (CopyOperation i, CopyOperation j) { return (i.GetFileSize() < j.GetFileSize());}
CopyList.sort(sort_by_size);
Non ce n'est pas la même chose.
Comme supposé par gb_68 la déclaration de ma structure est à l'intérieur d'une méthode. J'utilise donc un foncteur pour faire ma comparaison.
Si je veux utiliser une fonction je dois la déclarer en dehors de ma méthode et passer le pointeur de la fonction.
Déclarer des fonctions à gauche à droite pour ce genre de comparaison, ça ne me plait pas trop, ce n'est pas très orienté objet non plus, enfin je trouve.

Comme il s'agit d'une structure, on met les parenthèses pour indiquer qu'on instancie un objet et cet objet est passé en paramètre de sort.
Je pourrais écrire ça comme ça :
Code :
1
2
3
4
5
6
7
8
9
 
struct sort_by_size
{
	bool operator() (const CopyOperation& i, const CopyOperation& j) const { return (i.GetFileSize() < j.GetFileSize());}
};
 
sort_by_size MonObjet;
 
CopyList.sort(MonObjet);
Ou encore
Code :
1
2
3
4
5
6
7
 
struct
{
	bool operator() (const CopyOperation& i, const CopyOperation& j) const { return (i.GetFileSize() < j.GetFileSize());}
} sort_by_size;
 
CopyList.sort(sort_by_size);
ctxnop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 11h55   #6
Membre expérimenté
 
Homme Léo Gaspard
Lycéen
Inscription : janvier 2012
Messages : 342
Détails du profil
Informations personnelles :
Nom : Homme Léo Gaspard
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : janvier 2012
Messages : 342
Points : 575
Points : 575
Quitte à utiliser c++11, pourquoi ne pas passer à une lambda ?
Ekleog est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2012, 11h58   #7
Membre Expert
 
Avatar de ctxnop
 
Homme
Développeur informatique
Inscription : juillet 2007
Messages : 710
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 710
Points : 1 258
Points : 1 258
Envoyer un message via MSN à ctxnop
Citation:
Envoyé par Ekleog Voir le message
Quitte à utiliser c++11, pourquoi ne pas passer à une lambda ?
Bah disons que sur mon code initial je ne savais pas qu'il nécessitait le C++11, donc je ne pensais pas avoir accès aux lambdas.
Mais si je suis effectivement obligé d'activer le C++11 pour que mon code fonctionne, je vais effectivement passer par une lambda.
ctxnop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2012, 12h28   #8
Membre Expert
 
Avatar de ctxnop
 
Homme
Développeur informatique
Inscription : juillet 2007
Messages : 710
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 710
Points : 1 258
Points : 1 258
Envoyer un message via MSN à ctxnop
Bon voilà, j'ai passé le flags std=c++0x et tout fonctionne, c'était donc bien ça mon problème.
Par contre pour les lambdas, ça fonctionne aussi à la compilation, mais l'IDE (KDevelop en l'occurrence) n'aime pas du tout et souligne tout en rouge

Du coup je crois que je vais me passer des lambdas...

Merci en tout cas de vos réponses, je passe le thread en résolut.
ctxnop est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/02/2012, 19h12   #9
Membre éclairé
 
Homme Jun Maillard
Lycéen
Inscription : juin 2009
Messages : 221
Détails du profil
Informations personnelles :
Nom : Homme Jun Maillard
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : juin 2009
Messages : 221
Points : 372
Points : 372
Si tu veux un support du c++11 dans KDevelop, les versions récente en ont un assez bon (dont la reconnaissance des lambda). Soit tu peux essayer la béta qui vient de sortir, soit tu peux recompiler KDevelop toi-meme (des explications sont disponibles ici).
Joe Dralliam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 00h04   #10
Membre Expert
 
Avatar de ctxnop
 
Homme
Développeur informatique
Inscription : juillet 2007
Messages : 710
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 710
Points : 1 258
Points : 1 258
Envoyer un message via MSN à ctxnop
A partir de quelle version c'est dedans le coup des lambas ? Parce que je suis sous Gentoo, avec un KDE 4.8 et un KDevelop 4.2.3, et KDevelop aime pas les lambdas (elles compilent et s'exécutent sans problème, c'est juste KDevelop qui souligne tout en rouge hurlant à la syntax error )
Je trouve KDevelop suffisamment instable comme ça, pas envie de me farcir une bêta
ctxnop est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 18h05   #11
Membre éclairé
 
Homme Jun Maillard
Lycéen
Inscription : juin 2009
Messages : 221
Détails du profil
Informations personnelles :
Nom : Homme Jun Maillard
Localisation : France

Informations professionnelles :
Activité : Lycéen

Informations forums :
Inscription : juin 2009
Messages : 221
Points : 372
Points : 372
Ah... Je crois que la 4.2.3 est la dernière "stable" en date (Juin 2011); mais les lambdas ne sont supportée que depuis Juillet 2011, donc elles ne devraient etre disponible que dans la 4.3.x
Joe Dralliam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/02/2012, 18h14   #12
Membre Expert
 
Avatar de ctxnop
 
Homme
Développeur informatique
Inscription : juillet 2007
Messages : 710
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : juillet 2007
Messages : 710
Points : 1 258
Points : 1 258
Envoyer un message via MSN à ctxnop
Bien, bah j'attendrai d'avoir la 4.3 en stable.
De toute façon avec Gentoo je l'aurai des les dépôts bien assez tôt.
Dans la mesure où pour le moment il me souligne en rouge uniquement les expressions lambdas, ça n'a pas l'air de faire partir en vrille le reste de la validation syntaxique, du coup je vais peut être quand même me servir des lambdas, tant que c'est relativement ponctuel ça ne devrait pas poser de problème.
ctxnop est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h57.


 
 
 
 
Partenaires

Hébergement Web