éclaircissement sur for_each_n

Le problème exposé dans ce sujet a été résolu.

Bonjour tout le monde.

Voila je lisais ce bloc afin de comprendre ce que fait, de manière général, l’algorithme std::for_each. En le lisant j’ai découvert l’algorithme std::for_each_n.

J’ai compris qu’il attend 3 arguments :

  • 1 itérateur de début de la collection;
  • 1 certain nombre d’éléments N;
  • Et enfin une fonction.

Et que cet algorithme applique la fonction aux N premiers élément de la collection.

J’ai arrêté la lecture de ce bloc après avoir lu l’exemple d’utilisation de for_each_n. J’ai voulu l’appliquer a l’exemple du cours. Mais je tombe sur l’erreur ci-dessous, je comprends la signification de l’erreur mais pas pourquoi ça me dit que cet algorithme ne fait pas partie de l’espace nom std. Pourtant dans l’exemple du site cppreference for_each_n est déclaré avec std donc qu’il fait partie de cet espace nom. Je me demande si j’utilise mal cet algorithme.

Bref voici le code que j’ai essayé :

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>

int main ()
{
    std::vector<std::string> const v {
        "cas 1", "cas 2", "cas 3", "cas 4",
        "cas 5", "cas 6", "cas 7", "cas 8"
    };

    // je souhaite afficher le 5 premiers elements
    std::for_each_n (std::cbegin (v), 5,
        [] (std::string const & cas) -> void
        {
            std::cout << "cas reçu : " << cas << std::endl;
        }
    );

    return 0;
}

Et voici la commande de compilation :

g++ -std=c++17 test.cpp -Wall -Wextra -pedantic -o test.out

Et voici ce que me dit g++ (je comprends la signification mais pas la raison)

test.cpp: In function ‘int main()’:
test.cpp:14:10: error: ‘for_each_n’ is not a member of ‘stdstd::for_each_n (std::cbegin (v), 5,
          ^~~~~~~~~~
test.cpp:14:10: note: suggested alternative: ‘for_each’
     std::for_each_n (std::cbegin (v), 5,
          ^~~~~~~~~~
          for_each

J’ai même testé clang++ et ça me dit un peu près la même chose que g++. Curieusement en testant ce code a un compilateur en ligne : Wandbox. Ça compile normalement, aucun problème.

Merci en avance

+0 -0

Cela va dépendre de ta version de GCC. Elle est relativement décorrélée de celle la libstdc++ de GNU. Plus précisément. Si le compilo supporte le C++17, cela ne veut pas dire que l’implémentation de la lib standard fournie avec soit à jour. Il y a plein de choses du C++17 qui n’ont pas suivi aussi vite côté implémentation de la SL.

Pour clang, tu peux tenter d’utiliser à la place l’implémentation de la SL par LLVM: libc++? Ik faut d’abord l’installer, et après demander à l’employer avec -stdlib=libc++ — ce n’est pas le défaut sous Linux.

Sur ma machine ça compile correctement avec GCC 10.1.1 et libstdc++.so.6.0.28–10.1.1 donc tu dois avoir une version plus âgée (sûrement si tu utilises une LTS ou une distribution à rythme de sortie faible comme Debian stable, en partant du principe que tu utilises Linux mais ça n’est peut-être pas le cas, dans ce cas là ça dépendra de comment tu t’es procuré GCC sur ton système d’exploitation).

Merci pour le site FougereBle, je le connaissais mais j’avais oublié de l’enregistrer (c’est fait mtn).

Pour clang, tu peux tenter d’utiliser à la place l’implémentation de la SL par LLVM: libc++? Il faut d’abord l’installer, et après demander à l’employer avec -stdlib=libc++ — ce n’est pas le défaut sous Linux.

lmghs

D’accord je vais installer libc++ et voir le résultat.

Sur ma machine ça compile correctement avec GCC 10.1.1 et libstdc++.so.6.0.28–10.1.1 donc tu dois avoir une version plus âgée (sûrement si tu utilises une LTS ou une distribution à rythme de sortie faible comme Debian stable, en partant du principe que tu utilises Linux mais ça n’est peut-être pas le cas, dans ce cas là ça dépendra de comment tu t’es procuré GCC sur ton système d’exploitation).

Vanadiae

J’utilise linux mint (donc proche de Ubuntu)…Pour installer des logiciels je me sers d’un gestionnaire de logiciels (car c’est recommandé pour les débutants). Donc j’ai installé GCC grâce à ce logiciel. Je mets régulièrement mon système à jour.

Edit :

Avec les quelques bases que j’ai, j’ai fait ceci : gcc --version

puis le message suivant est apparu (j’espère que ça indique ma version) :

gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

+0 -0

Donc ton GCC date de 2018 (puisque ubuntu 18.04, de la forme AA.MM) ce qui est sûrement trop proche de 2017, l’année de sortie du C++17, et GCC met en général un certain temps à intégrer tous les changements du standard. Il faudrait donc que tu mettes à jour ta distribution, et grande coïncidence, la version 20 de Linux mint est sortie aujourd’hui si j’en crois https://linuxmint.com/ ! :D

Donc ton GCC date de 2018 (puisque ubuntu 18.04, de la forme AA.MM) ce qui est sûrement trop proche de 2017

En l’occurrence, GCC 7.5 date de fin 2019, sauf que c’est une branche de GCC qui date de 2017 (et en bug-fix depuis 2017) comme indiqué par le Copyright (C) 2017. La date de la distribution (ni celle de la release du compilateur) ne veut pas forcément dire grand chose, ce qui compte c’est la version majeure de GCC (et des libs utilisées) surtout…

+0 -0
Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte