none
Boucle for each et dernière version de Visual studio RRS feed

  • Question

  • Bonsoir,

    Je veux compiler deux librairies statiques qui partagent certaines classes.

    Le premier projet a été fait il y a plus d'un mois, fonctionne et ne génère aucune erreur à la compilation avec l'actuelle version de VisualStudio 15.5.2

    A l'image, c'est le projet en arrière fond cerclé en bleu

    En avant plan un nouveau projet, librairie statique avec quelques unes des classes utilisées dans les 2 projets.

    La, j'ai une erreur de compilation.

    VS n'accepte plus les for each, cerclée en rouge

    Je peux remplacer par un iterateur :

    vector<shared_ptr<SegmentBase>> kSeg;
    for(kSeg= p_Pol.m_DefinitionPolyligne.begin(); kSeg!= p_Pol.m_DefinitionPolyligne.end(); kSeg++)

    Je ne comprend pas la différence de comportement du compilateur et peut-on continuer à utiliser les boucle for each?

    Gérard

    mardi 19 décembre 2017 15:36

Réponses

Toutes les réponses

  • Bonjour, en lisant cette documention, le nom de la boucle est for_each et non for each, et votre erreur ressemble plus à une correction qui a été apportée.
    mardi 19 décembre 2017 16:13
  • Bonsoir,

    En C++, lorsque vous tapez foreach IntelliSense transforme le texte en for each comme indiqué dans les 2 fichiers.

    Par exemple, voila ce que produit VS lorsque vous tapez foreach:

      for each (object var in collection_to_loop)
      {

      }

    Il y a un espace entre for et each.

    Cordialement

    Gérard

    mardi 19 décembre 2017 16:26
  • L'extension au C++ "for each" que M$ a mise en place il y a plus de 10ans (voir 15) pour simplifier la vie des programmeurs C++ sous Visual Studio n'a pas été retenue par le comité de normalisation du C++ pour le norme C++11, sortie en 2011.

    Le comité lui préféra une approche plus simple avec un nouveau mot-clé "for_each" plutôt qu'une combinaison de 2 mots (dont l'un n'était même pas clé).

    M$ maintient la compatibilité un certain temps mais je pense qu'au bout de 6 ans, quand on lui demande de respecter la norme C++17 (comme vous l'avez indiqué dans un de vos récents posts sur ce forum), le compilateur commence à sévir sur l'utilisation de de "for each".

    Normalement, c'est juste remplace "for each( ... in ...)" en "for_each( ... in ...)" pas plus (remplacement d'un " " pas un "_").


    Paul Bacelar, Ex - MVP VC++


    P.S. le snippet n'est vraisemblablement à jour (et n'a pas forcement accès à l'exigence de conformité au C++17.
    mardi 19 décembre 2017 16:47
    Modérateur
  • Il semblerait que la boucle for each ne soit pas en standard en c++, à la place, faites appel à BOOST_FOREACH

    Voir source


    • Modifié SquallFF8 mardi 19 décembre 2017 16:53
    mardi 19 décembre 2017 16:53
  • Bonsoir,

    Merci pour toutes vos réponses.

    J'ai trouvé la différence entre les 2 projets.

    Par défaut, les nouveaux projets ont une option

    C/C++/Langage/Mode de conformité

    fixée à 

    Oui (/permissive-)

    J'ai remis à

    Non

    Et mon nouveau projet compile comme avant.

    J'ai essayé for_each

    le mot n'est pas reconnu.

    Cordialement

    Gérard

    mardi 19 décembre 2017 17:25
  • Avez-vous essayé BOOST_FOREACH ?
    mercredi 20 décembre 2017 08:35
  • std::for_each est présent dans l'en-tête <algorithm> : https://msdn.microsoft.com/fr-fr/library/e5sk9w9k.aspx.

    Cordialement,

    • Marqué comme réponse GP79 mardi 26 décembre 2017 12:05
    mercredi 20 décembre 2017 11:52
  • Ooups, c'est même pas un mot clé, c'est juste une fonction template.

    http://en.cppreference.com/w/cpp/algorithm/for_each

    J'ai dit un peu beaucoup de conneries. :-°

    Privilégiez le "range-based for loop".

    http://en.cppreference.com/w/cpp/language/range-for


    Paul Bacelar, Ex - MVP VC++

    mercredi 20 décembre 2017 12:37
    Modérateur
  • Bonjour,

    Avec <algorithm> çà fonctionne bien.

    Merci à tous pour vos réponses.

    Cordialement

    Gérard

    mardi 26 décembre 2017 12:07