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 :

comment insérer dans un set de class


Sujet :

SL & STL C++

  1. #1
    Inactif
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Points : 11
    Points
    11
    Par défaut comment insérer dans un set de class
    salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    TS* t=new TS(w);
    set<TS> sec_ts;
    sec_ts.insert(*t);
    et bah voilà les erreurs qui .....
    le dernière ligne provoque l'erreur suivante
    instantiated from here
    /usr/lib/gcc/i586-mandriva-linux-gnu/4.1.1/../../../../include/c++/4.1.1/bits/stl_function.h:227: error: no match for ‘operator<’ in ‘__x < __y’

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par ilyes_ka Voir le message
    instantiated from here
    /usr/lib/gcc/i586-mandriva-linux-gnu/4.1.1/../../../../include/c++/4.1.1/bits/stl_function.h:227: error: no match for ‘operator<’ in ‘__x < __y’
    (Re)Salut,
    Je crois que l'erreur est suffisamment explicite : il te manque un opérateur '<' sur ta classe TS.
    En effet, les conteneurs associatifs de type std::set ou std::map nécessite que les clés puissent être ordonnées. Il faut donc un tel opérateur.

  3. #3
    Inactif
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    ta reponse et tout à fait très logique car les set ce n'est autre qu'une arbre ordanné soit disant!!!! donc il le faut un opérateur pour créer l'ordre!!!!!
    bah si tu je dis que je veux effectuer mon ordre sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ts_h->countinuity_conter;
    ts_h->version_number;
    et supposant que j'ai dejà les gettteurs sur ces attribut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int getcountinuitycounter() const;
    int getversionnumber() const;
    et pour te dire la vérité je n'ai jamais utilisé un set dans son vrai contexte toujours avec des int; float......
    c comme meme l'occasion

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Les std::set fonctionnent selon le principe de l'arbre binaire...

    Cela signifie que l'insertion se fait selon le principe du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    si a<b
        je vais à gauche
    sinon si b<a
        je vais à droite
    sinon
        j'ai l'objet
    La différence entre un set et une map tient en cela que dans la map la clé utilisée pour le tri peut être séparée de l'objet maintenu alors que dans le set cette clé est l'objet maintenu.

    Pour pouvoir fonctionner, il faut donc disposer du moyen de déterminer si un objet est plus petit qu'un autre, et donc de l'opérateur < (ou de n'importe quel foncteur équivalent).

    Il est aussi à noter que le std::set a cette particularité que les itérateurs que nous obtenons dessus fournissent un acces en lecture seule (des itérateurs sur objets constants) car, comme l'ojbet est la clé qui sert pour le tri, toute modification de l'objet implique potentiellement une modification de la valeur de la clé, ce qui entrainerait la nécessité du déplacement de l'objet au sein du set afin de le garder trié

  5. #5
    Inactif
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    bouton résolu oui mais pour le théorique!

    voilà ce que j'ai appliqué


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         const TS operator < (TS* t) const { return (((this->getcoutinuity_counter() ) < (t->getcoutinuity_counter() )) ? (this ): (t)); }
    //TS est classe


    et voilà ce qu'il m'attend

    ../include/section.h: In member function ‘const TS TS::operator<(TS*) const’:
    ../include/section.h:43: error: passing ‘const TS’ as ‘this’ argument of ‘u_int8 TS::getcoutinuity_counter()’ discards qualifiers
    ../include/section.h:43: error: conversion from ‘const TS*’ to non-scalar type ‘const TS’ requested

  6. #6
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     bool operator < (TS const & t) const
    Ensuite dans la méthode tu ne peux appeler que des méthodes const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    { 
    return this->getcoutinuity_counter()  < t->getcoutinuity_counter(); 
    }
    getcoutinuity_counter doit être const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    RetourT getcoutinuity_counter() const;

  7. #7
    Inactif
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    j'ai modifier l'implémentation comme prévue
    sa fctionne sauf il faut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    t.getcountinuitycounter()
    tout va bien comme compilation g++ -c .

    en utilisant ça dans une fct main
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    TS* t=new TS(w);//w est un param 
    set <TS> sec_ts;
    sec_ts.insert((TS)(*t));
    Section* sec1=new Section(sec_ts);
    sec1->set_payload(sec_ts);
    et bah il y a une erreur
    ce que j'ai fait c
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    g++ -c section.ccp
    ar ruv libmy.a section.o
    ranlib libmy.a
    g++ main.cpp -o mm -L . -l my
    et voilà l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /home/sst/tmp/ccZQ4V0x.o: In function `Section::Section(std::set<TS, std::less<TS>, std::allocator<TS> >)':
    main.cpp:(.text._ZN7SectionC1ESt3setI2TSSt4lessIS1_ESaIS1_EE[Section::Section(std::set<TS, std::less<TS>, std::allocator<TS> >)]+0x8): undefined reference to `vtable for Section'
    collect2: ld returned 1 exit status

  8. #8
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 627
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 627
    Points : 30 692
    Points
    30 692
    Par défaut
    Ca, c'est une erreur d'édition de liens... Ce qui est rassurant, c'est que tu as déjà réussi à passer l'étape de la compilation proprement dite

    Ce que cette erreur t'indique, c'est que l'éditeur de liens n'est pas en mesure de retrouver la vtable (la table qui permet de faire le lien entre un objet qui se fait passer pour le type de base et son type réel) pour ta classe Section.

    Typiquement, ce problème survient lorsque tu déclares une fonction virtuelle mais que tu l'implémente de manière inline.

    Il faut donc que tu vérifies l'opportunité de rendre virtuelle les fonctions déclarées comme telle et la manière dont tu a implémenté chacune de ces fonctions...

    Il devrait y en avoir quelques unes qui sont implémentées inline, c'est à dire sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Section
    {
        public:
            virtual void foo()
            {
                /*implémentation de la fonction ici */
            }
    };
    Il s'agit d'"exporter" l'implémentation de la fonction dans le fichier .cpp correspondant, c'est à dire sous une forme proche de
    dans le fichier .hpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class Section
    {
        public:
            virtual void foo(); // pas d'implementation ici
    };
    et dans le fichier .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void Section::foo()
    {
        /*ce qui doit être fait */
    }
    Evidemment, si la fonction ne doit - de manière générale - pas être redéfinie, et encore plus si la classe Section ne fait pas partie d'une hiérarchie de classes, il est opportun de s'éviter le cout de la virtualité de la fonction

  9. #9
    Inactif
    Inscrit en
    Mars 2009
    Messages
    20
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 20
    Points : 11
    Points
    11
    Par défaut
    bon mon pb est resolu

    cette erreur d'édition de lien est du aux methodes de la classes TS que je n'ai déclarré

    bon c bon pour le moment

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/05/2009, 23h22
  2. Réponses: 2
    Dernier message: 14/11/2008, 14h14
  3. [MySQL] Comment insérer dans une table des données générées dynamiquement
    Par methodman225 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 22/04/2008, 11h50
  4. Comment insérer dans une table?
    Par souminet dans le forum Bases de données
    Réponses: 3
    Dernier message: 26/01/2008, 14h28
  5. Réponses: 5
    Dernier message: 19/04/2005, 09h46

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