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 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 129
    Points : 33 061
    Points
    33 061
    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.

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