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 :

probleme avec list sort.


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut probleme avec list sort.
    Bonjour, je tente de définir une fonction comparaison pour pouvoir ensuite l'utiliser comme ceci: maListe.sort(comparaison).


    Voici le code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bool Liste :: comparerLiaisons(Liaison premiere , Liaison deuxieme)
    {
       //Mon code
    }
    void Liste:: trierListeLiaisons()
    {
        l_liaisons.sort(comparerLiaisons);
    }
    Lorsque j'effectue mon code j'obtiens le message d'erreur suivant:
    no matching function for call to `std::list<Liaison, std::allocator<Liaison> >::sort(<unknown type>)'

    candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = Liaison, _Alloc = std::allocator<Liaison>]...
    Qqun peut m'aider?

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Tu ne peux pas utiliser une méthode comme prédicat de cette manière, le plus simple est de passer par une fonction libre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    namespace
    {
      bool comparerLiaisons(const Liaison& premiere , const Liaison& deuxieme)
      {
         //Mon code
      }
    }
    void Liste:: trierListeLiaisons()
    {
        l_liaisons.sort(&comparerLiaisons);
    }
    MAT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    Alors cela ne semble pas vraiment fonctionner, il y a quelque chose que je ne comprends pas, je vais afficher les deux méthodes au complet...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
     
    bool Liste :: comparerLiaisons(const Liaison& premiere ,const Liaison& deuxieme)
    {
        int i = 0;
        if(premiere.getJour() < deuxieme.getJour())
        {
            return true;
        }
        else if(premiere.getJour() > deuxieme.getJour())
        {
            return false;
        }
        else if(premiere.getDepart() == deuxieme.getDepart())
        {
            while( (i < (premiere.getDest()).length()) && (i < (deuxieme.getDest()).length()) )
            {
                if(tolower((premiere.getDest())[i]) < tolower((deuxieme.getDest())[i]))
                {
                    return true;
                }
                else if(tolower((premiere.getDest())[i]) > tolower((deuxieme.getDest())[i]))
                {
                    return false;
                }
                i++;
            }
            if((premiere.getDest()).length() > (deuxieme.getDest()).length())
            {
                return false;
            }
            else
            {
                return true;
            }
        }
        else
        {
            while( (i < (premiere.getDepart()).length()) && (i < (deuxieme.getDepart()).length()) )
            {
                if(tolower((premiere.getDepart())[i]) < tolower((deuxieme.getDepart())[i]))
                {
                    return true;
                }
                else if(tolower((premiere.getDepart())[i]) > tolower((deuxieme.getDepart())[i]))
                {
                    return false;
                }
                i++;
            }
            if((premiere.getDepart()).length() > (deuxieme.getDepart()).length())
            {
                return false;
            }
            else
            {
                return true;
            }
        }
    }
    void Liste:: trierListeLiaisons()
    {
        l_liaisons.sort(&comparerLiaisons);
    }
    et voici mon message d'erreur...
    liste.cpp: In member function `void Liste::trierListeLiaisons()':
    liste.cpp:138: error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say `&Liste::comparerLiaisons'

    C:/Program Files/Dev-Cpp/include/c++/3.4.2/bits/list.tcc: In member function `void std::list<_Tp, _Alloc>::merge(std::list<_Tp, _Alloc>&, _StrictWeakOrdering) [with _StrictWeakOrdering = bool (Liste::*)(const Liaison&, const Liaison&), _Tp = Liaison, _Alloc = std::allocator<Liaison>]':

    C:/Program Files/Dev-Cpp/include/c++/3.4.2/bits/list.tcc:360: instantiated from `void std::list<_Tp, _Alloc>::sort(_StrictWeakOrdering) [with _StrictWeakOrdering = bool (Liste::*)(const Liaison&, const Liaison&), _Tp = Liaison, _Alloc = std::allocator<Liaison>]'
    liste.cpp:138: instantiated from here
    C:/Program Files/Dev-Cpp/include/c++/3.4.2/bits/list.tcc:324: error: must use .* or ->* to call pointer-to-member function in `__comp (...)'

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Il faut que comparerLiaisons soit une fonction libre (dans un namespace anonyme c'est plus propre) et non une méthode.

    MAT.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    Désolé mon ignorance... mais je n'ai pas eu à faire ça souvent...
    J'imagine que je dois préciser le namespace dans mon fichier.h.
    Pour une raison ou une autre il ne le prend pas...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        //Permet de retirer une liaison
        void retirerLiaison(Liaison liaison);
        //Affiche les liaisons sur le terminal
        void listerLiaisons();
     
        namespace
        {   //Comparer deux liaisons
            bool comparerLiaisons(const Liaison& premiere ,const Liaison& deuxieme);
        }
        void trierListeLiaisons();

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    81
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2007
    Messages : 81
    Par défaut
    D'accord j'ai compris... Merci beaucoup!!

  7. #7
    Membre chevronné
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mars 2006
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo

    Informations forums :
    Inscription : Mars 2006
    Messages : 400
    Par défaut
    Citation Envoyé par watiero Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    bool Liste :: comparerLiaisons(Liaison premiere , Liaison deuxieme)
    {
       //Mon code
    }
    void Liste:: trierListeLiaisons()
    {
        l_liaisons.sort(comparerLiaisons);
    }
    Comme comparerLiaisons ne dépend pas d'un objet Liste, tu peux en faire une fonction membre statique.

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

Discussions similaires

  1. [MySQL] Probleme avec liste deroulante et requete
    Par castelligreg dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 06/12/2006, 14h39
  2. probleme avec liste chainée
    Par isoman dans le forum C
    Réponses: 14
    Dernier message: 29/11/2006, 23h03
  3. probleme avec liste chainée
    Par Liiscar dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 28/11/2006, 20h37
  4. [MySQL] probleme avec liste déroulante et requete
    Par Ludo75 dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/01/2006, 13h55
  5. Petit probleme avec Arrays.Sort(...)
    Par Seth77 dans le forum Collection et Stream
    Réponses: 11
    Dernier message: 15/01/2006, 12h48

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