IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Problème de compilation avec std::list<T>.sort


Sujet :

SL & STL C++

  1. #1
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 ?

  2. #2
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    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 : 232
    Points : 546
    Points
    546
    Par défaut
    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).

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    La syntaxe serait pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyList.sort(sort_by_size);
    ?

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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);
    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.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  4. #4
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    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.

  5. #5
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    Citation Envoyé par Bousk Voir le message
    La syntaxe serait pas plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CopyList.sort(sort_by_size);
    ?

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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);

  6. #6
    Membre éclairé
    Avatar de Ekleog
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2012
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2012
    Messages : 448
    Points : 879
    Points
    879
    Par défaut
    Quitte à utiliser c++11, pourquoi ne pas passer à une lambda ?

  7. #7
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    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.

  8. #8
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    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.

  9. #9
    Invité
    Invité(e)
    Par défaut
    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).

  10. #10
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    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

  11. #11
    Invité
    Invité(e)
    Par défaut
    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

  12. #12
    Membre expérimenté Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    Points : 1 732
    Points
    1 732
    Par défaut
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme de compilation avec std::list
    Par drcd dans le forum MFC
    Réponses: 3
    Dernier message: 10/07/2006, 21h28
  2. Problème de compilation avec Direct Input
    Par di-giac dans le forum DirectX
    Réponses: 6
    Dernier message: 06/05/2005, 18h19
  3. [MFC] Problème de compilation avec afxctl.h
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 15/06/2004, 13h51
  4. Problème de compilation avec Dev-C++
    Par Rouliann dans le forum Dev-C++
    Réponses: 14
    Dernier message: 14/06/2004, 18h44
  5. Réponses: 1
    Dernier message: 29/10/2003, 12h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo