Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 069
    Points : 5 080
    Points
    5 080

    Par défaut erase remove et visual 2010

    Bonjour à tous,

    je ne sais pas ce que j'ai aujourd'hui, j'y arrive pas
    regardez le code suivant:

    Code :
    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
    #include <set>
    #include <algorithm>
     
    using namespace std;
     
    struct Mere
    {
    	Mere( int x = 0, int y = 0 ) : x(x), y(y) {}
    	int x, y;
    };
     
    struct MereComp // foncteur qui compare 2 Meres en fonction de x
    {
    	bool operator () ( Mere * left, Mere * right ) { return ( left->x < right->x ); }
    };
     
    struct Fille1: public Mere
    {
    	Fille1( int x = 0, int y = 0 ) : Mere(x,y) {}
    };
     
    struct Fille2: public Mere
    {
    	Fille2( int x = 0, int y = 0 ) : Mere(x,y) {}
    };
     
    int main()
    {
    	multiset< Mere*, MereComp > s;
    	s.insert( new Fille2( 2, 200 ) );
    	s.insert( new Fille1( 1, 100 ) );
     
    	// erase remove:
    	s.erase( remove( s.begin(), s.end(), 200 ), s.end() );
     
    }
    j'ai un multiset de Mere*, trié selon la valeur x (membre de la classe Mere).
    J'insère des Mere* dans le multiset, tout va bien.
    Maintenant, je voudrais faire le erase remove de la dernière ligne, qui consiste à supprimer un élément en fonction de sa valeur de y (en supposant que tout les y de toutes les instances de Mere sont différents). Seulement il n'y a pas moyen. Ça fait 3 heures que je suis dessus...

    En fait, pour être honnête, je l'avais fais sous visual 2008, et ça fonctionnait, sans même un warning. Je le copie dans un projet que je fais avec vs2010, et là ça marche plus, avec une erreur incompréhensible (une histoire de _Next - dans la fonction remove - qui est const alors qu'il n'y a aucune raison qu'il le soit). Je me suis donc créé un projet minimum qui reproduit l'erreur. C'est le code ci-dessus.

    Je ne vous met pas les messages d'erreur car d'une part ils pointent dans la stl, et bien profond, et d'autre part j'ai essayé 5 millions de trucs et je ne sais pas laquelle de ces tentatives est la plus pertinente. Le mieux c'est que vous essayez de compiler. Là dans l'état il manque au moins une chose: quelque chose qui permet de comparer un Mere* avec un int. Initialement, j'avais ceci (en membre de Mere):
    Code :
    bool operator == ( Mere * other ) { return ( this->y == other->y ); }
    Mais avec vs2010 ça ne marche plus... et le message d'erreur c'est... mon dieu le message d'erreur... si je le poste je vais faire crasher le serveur de developpez.com

    Comprends pô

  2. #2
    Membre Expert
    Avatar de Goten
    Inscrit en
    juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 23

    Informations forums :
    Inscription : juillet 2008
    Messages : 1 580
    Points : 1 990
    Points
    1 990

    Par défaut

    Tu peux pas faire ça, std::remove marche pas sur les std::set, parce que les objets sont immutables. (et donc les iterateurs aussi).
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 069
    Points : 5 080
    Points
    5 080

    Par défaut

    Citation Envoyé par Goten Voir le message
    Tu peux pas faire ça, std::remove marche pas sur les std::set, parce que les objets sont immutables. (et donc les iterateurs aussi).
    flute.
    Mais alors c'est visual 2008 qui est trop permissif et qui ne respecte pas la norme? Ou bien c'est une modification du 0x11?

  4. #4
    Membre Expert
    Avatar de Goten
    Inscrit en
    juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 23

    Informations forums :
    Inscription : juillet 2008
    Messages : 1 580
    Points : 1 990
    Points
    1 990

    Par défaut

    Citation Envoyé par r0d Voir le message
    flute.
    Mais alors c'est visual 2008 qui est trop permissif et qui ne respecte pas la norme? Ou bien c'est une modification du 0x11?
    Sa devrait vraiment pas passer avec visual studio... c'est étonnant. Rien à voir avec 0x nan.
    Vu que l'objet est la clef, derrière c'est stocké dans un RB-Tree je te laisse imaginer si on te laisser faire n'importe quoi avec.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  5. #5
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro Loïc Joly
    Développeur informatique
    Inscrit en
    août 2004
    Messages
    4 929
    Détails du profil
    Informations personnelles :
    Nom : Homme Loïc Joly
    Âge : 39
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : août 2004
    Messages : 4 929
    Points : 11 071
    Points
    11 071

    Par défaut

    C'est effectivement VC++2008 qui est trop permissif, et VC++2010 qui a corrigé ça.

  6. #6
    r0d
    r0d est déconnecté
    Expert Confirmé Sénior

    Profil pro
    Inscrit en
    août 2004
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : août 2004
    Messages : 4 069
    Points : 5 080
    Points
    5 080

    Par défaut

    ok merci

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

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •