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

Contribuez C++ Discussion :

erase remove et visual 2010


Sujet :

Contribuez C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    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 : 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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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ô
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    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 éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    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?
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    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
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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 : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    C'est effectivement VC++2008 qui est trop permissif, et VC++2010 qui a corrigé ça.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  6. #6
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    ok merci
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

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

Discussions similaires

  1. passage de visual 6.0 vers visual 2010
    Par voltron1984 dans le forum C++
    Réponses: 2
    Dernier message: 27/10/2010, 16h49
  2. visual 2008 to visual 2010 pbm linker
    Par guillaume07 dans le forum C++
    Réponses: 3
    Dernier message: 17/09/2010, 16h21
  3. visual 2010 et lambda
    Par guillaume07 dans le forum C++
    Réponses: 4
    Dernier message: 10/09/2010, 21h51
  4. visual 2010 express
    Par yan dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 15/05/2010, 17h22

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