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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    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 éclairé
    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 : 41
    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
    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 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 147
    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 émérite Avatar de ctxnop
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Morbihan (Bretagne)

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    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);

  5. #5
    Membre émérite
    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
    Par défaut
    Quitte à utiliser c++11, pourquoi ne pas passer à une lambda ?

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    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.

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 858
    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.

+ 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