Précédent   Forum du club des développeurs et IT Pro > C et C++ > C++ > Communauté
Communauté Suivez l'actualité C++ et contribuez à la vie de la communauté francophone C++
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 07/04/2011, 17h30   #1
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 672
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 672
Points : 4 433
Points : 4 433
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ô
r0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 18h20   #2
Goten
Membre Expert
 
Avatar de Goten
 
Inscription : juillet 2008
Messages : 1 580
Détails du profil
Informations personnelles :
Âge : 22

Informations forums :
Inscription : juillet 2008
Messages : 1 580
Points : 2 041
Points : 2 041
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
Goten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 18h39   #3
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 672
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 672
Points : 4 433
Points : 4 433
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?
r0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 18h40   #4
Goten
Membre Expert
 
Avatar de Goten
 
Inscription : juillet 2008
Messages : 1 580
Détails du profil
Informations personnelles :
Âge : 22

Informations forums :
Inscription : juillet 2008
Messages : 1 580
Points : 2 041
Points : 2 041
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
Goten est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/04/2011, 19h18   #5
JolyLoic
Rédacteur/Modérateur
 
Avatar de JolyLoic
 
Homme Loïc Joly
Développeur informatique
Inscription : août 2004
Messages : 4 675
Détails du profil
Informations personnelles :
Nom : Homme Loïc Joly
Âge : 38
Localisation : France

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

Informations forums :
Inscription : août 2004
Messages : 4 675
Points : 9 899
Points : 9 899
C'est effectivement VC++2008 qui est trop permissif, et VC++2010 qui a corrigé ça.
JolyLoic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 10h25   #6
r0d
Expert Confirmé Sénior
 
Inscription : août 2004
Messages : 3 672
Détails du profil
Informations personnelles :
Localisation : Belgique

Informations forums :
Inscription : août 2004
Messages : 3 672
Points : 4 433
Points : 4 433
ok merci
r0d est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 07h30.


 
 
 
 
Partenaires

Hébergement Web