C++ - Type de fonction surchargée non résolu

Bonjour,

J'essaye de supprimer en C++ moderne les premiers espaces d'une chaîne de caractères :

  • je créé une chaîne que je nomme test ;
  • j'utilise l'itérateur find_if_not qui devrait pointer sur le premier caractère qui n'est pas un espace ;
  • Enfin la fonction erase devrait effacer tous les espaces situés en début de chaîne de l'index 0 à l'index du premier caractère qui n'est pas un espace.

J'utilise le code suivant sous CodeBlocks :

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

using namespace std;

int main()
{
    string test {"  salut prog "};
    auto premierNonEspace {find_if_not(begin(test), end(test),isspace)};
    test.erase(begin(test),premierNonEspace);

    cout << test << endl;
    return 0;
}

CodeBlocks me trouve l'erreur suivante :

main.cpp|12|error: no matching function for call to 'find_if_not(std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)'|

Je n'arrive pas à trouver la solution.
Merci pour votre aide.

std::find_if_not ?

haha, c'est bonnard les message d'erreur du compilateur en C++ "moderne" ! on en redemande !
visiblement, c'est le 3ème argument de find_if_not qui ne lui plait pas.
EDIT: peut-être aussi la remarque de @lesept ?

Si c'est @biggil alors peut-être :

#include <ctype.h>

pour qu'il trouve isspace

Bonjour @biggil
bonjour @lesept

Non car :

#include <algorithm>
#include <ctype.h>
#include <iostream>
#include <string>

using namespace std;

int main()
{
    string test {"  salut prog "};
    auto premierNonEspace {find_if_not(begin(test), end(test),isspace)};
    test.erase(begin(test),premierNonEspace);

    cout << test << endl;
    return 0;
}

même erreur :
D:\Utilisateur\Documents\CodesBlocks\suppression espaces\main.cpp|11|error: no matching function for call to 'find_if_not(std::__cxx11::basic_string<char>::iterator, std::__cxx11::basic_string<char>::iterator, <unresolved overloaded function type>)'|

avec #include <cctype.h> le compilateur ne trouve pas la librairie ...

Merci pour votre aide.

Je pense que c'est le auto qui pose problème : essaye char ?

merci @lesept mais j'ai la même erreur.

Alors, faut attendre @J-M-L ... :grin:

Merci quand même à vous deux ...

Ou peut-être la réponse ici

Merci @lesept
Le problème est énoncé et la solution est donnée :

#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main()

{
    string test {" r salut prog "};

    auto predicate = [](unsigned char c) { return isspace(c); };


    auto premierNonEspace {find_if_not(begin(test), end(test),predicate)};

    test.erase(begin(test),premierNonEspace);

    cout << test << endl;
    return 0;
}



Merci beaucoup
bonne soirée.

Donc :
Le problème :
2 versions de isspace qui entrent en conflit et que le compilateur ne sait pas choisir :

  • une dans <cctype> ;
  • une autre dans <locale> inclut par <iostream>.

Les solutions :

  • la lambda de mon message précédent ;
  • un cast vers la bonne signature de fonction que voici :
#include <algorithm>
#include <iostream>
#include <string>
#include <cctype>

using namespace std;

int main()

{
    string test {" r salut prog "};
    
    auto premierNonEspace {find_if_not(begin(test), end(test),static_cast<int(*)(int)>(isspace))};

    test.erase(begin(test),premierNonEspace);

    cout << test << endl;
    return 0;
}

  • une version plus récente de GCC.

PS : C'est pour moi que je fais cette synthèse car le forum me sert de référence. Quand j'ai besoin de revenir sur un point c'est plus simple de se connecter et de retrouver les détails.

Bon.

const char* message = "  salut prog ";
const char* q = message;
while ( *q++ == ' ' ); q--;
// q pointe vers le 1er non-blanc

Aaaah, que ça fait du bien, nom de Diou !

J'adhère.
J'ai connu un projet sur lequel les participants ont passé leur temps à évaluer les possibilités de la librairie Boost, et l'outil de compilation Scons.
Ils se sont aperçu au bout du compte, après plusieurs mois d'errance, qu'ils avaient oublié une chose : écrire l'application :woozy_face:

En nombre de ligne il n'y a pas une grosse différence, mais en lisibilité ça rien à voir.
Après il ne faut pas oublié que @philippe86220 essaye de ce former, et le meilleur moyen reste de faire la même chose de plusieurs façon.

@biggil
Je viens d'acheter un livre sur les techniques de hacking (dans le bon sens du terme), l'auteur commence par des cours sur le C.
Alors oui le C est un excellent langage de programmation, d'ailleurs le hackeur c'est celui qui va faire le code le plus simple, le plus court et le plus efficace (entre autre).
Maintenant le C++ n'est pas mal non plus sur les ordinateurs avec beaucoup de mémoire et des microprocesseurs...
J'apprends le C++ comme je vais apprendre le python et c'est tout.
Je n'ai pas beaucoup d'expérience, j'essaye juste d'en acquérir.
Mais je ne suis pas non plus binaire même si ce concept devient pour moi une véritable passion dans le domaine de l'électronique.
Il n'y a pas d'un côté le bon langage et d'un autre le mauvais. Tout n'est pas noir ou blanc
En fait tout est dans la nuance et ça c'est l'expérience de la vie qui me l'a appris :wink:
Attention j'ai beaucoup de respect pour toi et je reconnais volontiers tes compétences exceptionnelles (si mes souvenirs sont bons tu as eu dans ta carrière à gérer un programme sur la fermeture des portes du métro. Il ne fallait pas se tromper !!!). De plus il est évident pour moi que je suis loin d'être à ton niveau ! Je reste à ma place !
Voilà oui le C c'est bien mais c'est pas pour ça qu'il faut oublier le reste.

Ma réponse à @biggil est la même pour @hbachetti .

C'est exactement ça et je découvre au fur et à mesure de manière empirique. Parfois j'ai raison, parfois j'ai tort !

Le tout dernier livre pour apprendre à programmer : "50 nuances de C". :laughing:

Ton premier problème est que ton approche du C++ est plus adaptée au monde du PC qu'au monde embarqué. Dans l'embarqué, on pense avant tout efficacité et économie de ressources.
Qui utilise la classe string (je ne parle pas de String) et des itérateurs sur ARDUINO ?
Certains projets embarqués pointus s'interdisent même l'allocation dynamique !
Tu ferais mieux de faire tourner tes exemples sur PC.

Le deuxième problème est le suivant : qui va s'emmerder à l'heure actuelle à écrire une application en C++ sur PC alors que d'autres langages beaucoup plus efficaces comme PYTHON ou RUBY existent ?
Cela vaut-il la peine d'investir autant de temps sur un langage complètement dépassé ?

Bien vu :rofl: je me bidonne derrière mon écran et c'est vrai.
Vous m'êtes tous bien sympathique :slightly_smiling_face:

Je suis d'accord mais n'oublie pas la POO toi qui a fait des librairies :slightly_smiling_face: tes classes tu les fais en quel langage ? C ou C++ ?