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

C++ Discussion :

Conversions


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut Conversions
    :pingoin: Bonsoir,
    J'aimerais ecrire une fonction Clean:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Clean(CPieces& aMove);
    Son but est de passer en revue des objets CPieces d'une liste:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    list <CPieces> Recipient;
    et d'en suprimer certains suivant un critère quelconque.
    J'ai donc ecrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for_each(Recipient.begin(),Recipient.end(),Clean);
    Mais je récupère le message suivant à la compilation:
    C:\...\EchecEtMat\Logic.cpp(91) : error C2664: 'for_each' : cannot convert parameter 3 from 'void (class CPieces &)' to 'void (__thiscall *)(class CPieces &)'
    None of the functions with this name in scope match the target type
    Je rame un peu (pour pas dire beaucoup) avec les subtilités de la conversion.Le principe général ne m'est pas étranger mais ce genre de finesses me laissent perplexe....

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2003
    Messages
    65
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mars 2003
    Messages : 65
    Par défaut
    Si tu utilises VC6, c'est probablement un bogue du compilateur qui n'implémente pas le standard correctement. Je crois qu'en retournant un int avec ta fonction Clean(), ça contourne le problème. Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int Clean(CPieces& aMove)
    {
    ...
     
    return (0);
     
    }
    Cependant, ce n'est pas une bonne idée de supprimer des éléments avec l'algorithme for_each(), vois plutôt remove().

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    Ok
    J'essaye et je te tiend au courrant.

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Clean ne peut pas être une fonction membre, du moins pas dans ton cas.

    Sinon effectivement, pour supprimer des éléments d'un conteneur tu as l'option erase + remove_if qui marche bien.

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    :pingoin: Bonjour,
    Je crois bien que je vais utiliser remove_if comme vous me le dites parceque ça coince toujours

    ps:Et si je déclare Clean comme fonction membre de CPieces?

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut lo
    Je pense que le mieux est effectivement d'utiliser remove_if + erase, avec un foncteur qui va bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    struct Clean
    {
       bool operator ()(const CPiece& p) const
       {
          if (blah blah)
             return true;
          else
             return false;
       }
    };
     
    Recipient.erase(std::remove_if(Recipient.begin(), Recipient.end(), Clean()), Recipient.end());
    Sinon, si Clean était une fonction membre de CPiece, il faudrait utiliser std::mem_fun_ref.

  7. #7
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    L'idiome erase-remove est bien, mais pas pour les listes. Il sert avec les conteneurs dont les objets sont consécutifs en mémoire.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est vrai que les listes possèdent la fonction membre remove_if, je n'y pensais plus. Par contre on peut toujours utiliser le erase-remove_if pour les vieux compilos (VC6) qui ne supportent pas les fonctions membres templates de classes template.

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2004
    Messages
    187
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 187
    Par défaut
    :pingoin: Bonsoir,
    Je suis tres impressionné par les réponses... Il va me faloir un petit peu de temps pour les digérer et les mettre en oeuvre mais quelque chose me dit que ça va marcher....

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

Discussions similaires

  1. Conversion Assembleur Motorola 68xxx en Intel 80xxx
    Par markham dans le forum Autres architectures
    Réponses: 3
    Dernier message: 22/11/2002, 20h09
  2. [MSXML] Comment empécher la conversion des entités ?
    Par nima dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 08/11/2002, 14h14
  3. Algorithme de conversion de RTF vers HTML
    Par youtch dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 10/09/2002, 12h35
  4. [Conversions] Millisecondes...
    Par agh dans le forum Langage
    Réponses: 2
    Dernier message: 06/08/2002, 11h25
  5. Réponses: 2
    Dernier message: 05/06/2002, 12h29

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