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

Langage C++ Discussion :

Problème conversion de conteneur stl set


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Problème conversion de conteneur stl set
    Bonjour,
    Je viens vous voir aujourd'hui car je ne parvient pas à convertir un conteneur..
    Voici un morceau de code qui pourra expliquer mon problème

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    bool comparerSavingsGain (SavingsGain a, SavingsGain b) {
        return a.gain > b.gain;
    }

    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
     
    set<SavingsGain> Solution::creerGainsTries(Probleme &p) {
        unsigned n = p.getN();
    	vector<Sommet> sommets = p.getSommets();
    	double * * distances = p.getDistances();
    	bool(*fn_pt)(SavingsGain,SavingsGain) = comparerSavingsGain;
        set<SavingsGain,bool(*)(SavingsGain,SavingsGain)> gains(fn_pt);
     
        for (unsigned i = 1; i < n - 1; ++i) {
            for (unsigned j = i + 1; j < n; ++j) {
                SavingsGain s;
                s.route = make_pair(i, j);
    			s.gain = distances[i][0] + distances[0][j] - distances[i][j];
     
    			gains.insert(s);
            }
        }
     
        return gains;
    }
    J'ai une erreur sur le "return" qui dit :
    Error : Il n'existe aucune conversion définie par l'utilisateur appropriée de "std::set<SavingsGain, bool (*)(SavingsGain, SavingsGain), std::allocator<SavingsGain>>" en "std::set<SavingsGain, std::less<SavingsGain>, std::allocator<SavingsGain>>"

    Merci d'avance
    et bonne journée

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Bonjour,

    Comme le dit le compilateur le type des deux set n'est pas identique :
    Le type de retour de la fonction est set<SavingsGain>, qui est en fait set<SavingsGain, std::less<SavingsGain>> (std::less est le comparateur fournit par défaut)
    Alors que dans le corps de la fonction on a set<SavingsGain,bool(*)(SavingsGain,SavingsGain)>

    Il n'y a pas plus de chance de convertir l'un vers l'autre que de convertir un std::vector en std::string par exemple, les types sont différents.

    Pour corriger le pb il faut donc que la fonction retourne le bon type de set :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    bool comparerSavingsGain(SavingsGain a, SavingsGain b) {
       return a.gain > b.gain;
    }
     
    typedef bool(*CompareSavingGain)(SavingsGain, SavingsGain);
     
    std::set<SavingsGain, CompareSavingGain> creerGainsTries()
    {
       std::set<SavingsGain, CompareSavingGain> gains;
      //...
       return gains;
    }
    Note : le constructeur par défaut de std::set construit en interne une instance du comparateur, ici un pointeur de fonction, donc pas besoin de lui passer en argument du constructeur.

  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 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Bonsoir,

    il serait bien mieux que le comparateur utilise des références constantes et non des copies.
    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.

Discussions similaires

  1. problème avec les conteneurs STL
    Par burak dans le forum SL & STL
    Réponses: 7
    Dernier message: 19/04/2009, 17h43
  2. STL set et fonction membre du conteneur
    Par bobyjoe dans le forum SL & STL
    Réponses: 4
    Dernier message: 29/06/2007, 13h23
  3. Fonction polymorphe et conteneur stl.
    Par Captain Fizzou dans le forum SL & STL
    Réponses: 2
    Dernier message: 29/11/2004, 19h13
  4. Problème conversion date
    Par mat.M dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/03/2004, 15h05
  5. Problème avec accents et CHARACTER SET ISO8859_1
    Par kinda dans le forum InterBase
    Réponses: 13
    Dernier message: 30/10/2003, 15h49

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