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

C++ Discussion :

surcharge d'un operateur de comparaison dans une priority_queue


Sujet :

C++

  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut surcharge d'un operateur de comparaison dans une priority_queue
    bonjour,

    je dois utiliser une priority_queue mais avec mon prorper operateur de comparaison.

    voici comment je défini la priority_queue.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            std::priority_queue< std::vector<std::set<CClause*> * >, CompareClause() > Q;
    et le compareClause est ici.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     
    struct CompareClause{
     
        bool operator ()( const std::set<CClause*> *p, const std::set<CClause*> *q ) 
        { 
            return p->size() < q->size() ; 
        } 
     
    };

    j'aurais cru qu'il fallait utiliser les foncteurs, mais il m'envoi ballader.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    ocuments/Logic$ make -j 2
    g++ -o Antichaine.o -c Antichaine.cpp -Wall -ansi
    Antichaine.cpp: In member function ‘void CAntichaine::construireA()’:
    Antichaine.cpp:20: erreur: ‘CompareClause ()()’ is not a class, struct, or union type
    Antichaine.cpp:20: erreur: patron de l'argument 3 est invalide
    Antichaine.cpp:20: erreur: invalid type in declaration before ‘;’ token
    Antichaine.cpp:20: attention : unused variable ‘Q’
    make: *** [Antichaine.o] Erreur 1
    elekis@carla:~/Documents/Logic$
    le truc, c'est que l'on doit mettre pas mal d'élément dedans (des std::set<Clause*> ) et apres on doit les retirer un a un du plus grand au plus
    petit. et on voudrais que le plus grand est celui qui a le plus grand nombre de clause.


    merci

    a+++

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Ce n'est pas une instance du foncteur que tu dois spécifier en paramètre template, mais son type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::priority_queue< std::vector<std::set<CClause*> * >, CompareClause>
    Après si ce n'est pas une instance par défaut qu'il faut utiliser (ce qui n'est pas le cas ici) il y a normalement un constructeur approprié.

  3. #3
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2004
    Messages
    421
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2004
    Messages : 421
    Par défaut
    heu... merci,

    mais je comprend pas trop la seconde phrase.


    mnt , j'ai cela.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    elekis@carla:~/Documents/Logic$ make -j 2
    g++ -o Antichaine.o -c Antichaine.cpp -Wall -ansi
    g++ -o ClauseManager.o -c ClauseManager.cpp -Wall -ansi
    Antichaine.cpp: In member function ‘void CAntichaine::construireA()’:
    Antichaine.cpp:20: erreur: no type named ‘value_type’ in ‘struct CompareClause’
    Antichaine.cpp:20: erreur: patron de l'argument 3 est invalide
    Antichaine.cpp:20: erreur: invalid type in declaration before ‘;’ token
    Antichaine.cpp:20: attention : unused variable ‘Q’
    make: *** [Antichaine.o] Erreur 1
    make: *** Attente des tâches non terminées....
    elekis@carla:~/Documents/Logic$
    je comprend pas, je dois definir une value_type?? mais c'est quoi?

    et pourquoi il ne faut pas de () mais son type. dans l'exemple
    http://c.developpez.com/faq/cpp/?pag...TL_custom_sort
    c'est bien une instance qu'on passe. a la fonction sort??


    merci pour tout.

    a++

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Le message d'erreur parle de l'argument 3 (qui devrait être l'allocateur), or dans ce que tu nous montres il n'y en à que deux. On peut voir le vrai code ?

    et pourquoi il ne faut pas de () mais son type. dans l'exemple
    http://c.developpez.com/faq/cpp/?pag...TL_custom_sort
    c'est bien une instance qu'on passe. a la fonction sort??
    Parce que std::priority_queue<...> est un type, pas une fonction. Il attend en paramètre template le type du foncteur à utiliser, pas une instance de celui-ci.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct Foncteur
    {
        bool operator ()(int x, int y) const
        {
            return x < y;
        }
    };
     
    std::priority_queue<int, Foncteur> Q;
    Ta priority_queue va ensuite créer une instance par défaut de Foncteur, pour appeler son opérateur (). Ce que je disais c'est que si par hasard tu voulais utiliser une instance bien particulière, pas construite par défaut, tu peux le faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    struct Foncteur
    {
        Foncteur(std::string Param) {...}
     
        bool operator ()(int x, int y) const
        {
            return x < y;
        }
    };
     
    std::priority_queue<int, Foncteur> Q(Foncteur("toto"));

Discussions similaires

  1. Operateur de comparaison dans une formula
    Par Cofondinde dans le forum Hibernate
    Réponses: 2
    Dernier message: 19/05/2011, 10h09
  2. insertion et comparaison dans une collection
    Par Mykhell dans le forum PL/SQL
    Réponses: 0
    Dernier message: 18/06/2009, 15h07
  3. Comparaison dans une boucle
    Par dam28800 dans le forum Langage
    Réponses: 20
    Dernier message: 13/11/2008, 14h27
  4. Problème de comparaison dans une proc
    Par hpavavar dans le forum SQL Procédural
    Réponses: 7
    Dernier message: 27/02/2007, 13h34
  5. Réponses: 27
    Dernier message: 12/01/2006, 11h04

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