Je suis tombé sur un étrange problème de compilation. Je veux traiter une liste de chaînes, en utilisant std::for_each
. Le code simplifié suivant illustre le problème:std :: for_each ignorer l'argument de la fonction par défaut
# include <list>
# include <string>
# include <algorithm>
using namespace std ;
void f(wstring & str)
{
// process str here
}
void g(wstring & str, int dummy = 0)
{
// process str here, same as f, just added a second default dummy argument
}
int main(int, char*[])
{
list<wstring> text ;
text.push_back(L"foo") ;
text.push_back(L"bar") ;
for_each(text.begin(), text.end(), f) ; // OK, fine :)
for_each(text.begin(), text.end(), g) ; // Compilation error, complains about
// g taking 2 arguments, but called within std::for_each
// with only one argument.
// ...
return 0 ;
}
Je l'ai testé en utilisant MinGW 4.5.2 et MSVC10, tous deux ont signalé le même message d'erreur. A l'origine, je voulais utiliser boost::algorithm::trim
comme une fonction de traitement passée à std::for_each
, mais j'ai trouvé qu'il fallait deux arguments, le premier étant obligatoire (la chaîne à traiter) et le second optionnel (un paramètre régional fournissant une définition pour les caractères d'espace) .
Y a-t-il un moyen de garder les choses propres lorsque vous utilisez std::for_each
(et d'autres algorithmes standard) lorsque vous avez des fonctions ou des méthodes avec des arguments par défaut? J'ai trouvé un moyen de le faire fonctionner, mais il est plus claire et facilement compréhensible, donc une boucle for
commence à sembler plus facile ...
# include <list>
# include <string>
# include <algorithm>
# include <boost/bind.hpp>
# include <boost/algorithm/string.hpp>
using namespace std ;
using namespace boost ;
// ... somewhere inside main
list<wstring> text ;
for_each(text.begin(), text.end(), bind(algorithm::trim<wstring>, _1, locale()) ;
// One must deal with default arguments ...
// for_each(text.begin(), text.end(), algorithm::trim<wstring>) would be a real pleasure
Merci pour toute aide!
Remarque: Je viens de commencer à apprendre l'anglais, désolé pour les erreurs :)
Je pense que ça ne fonctionne tout simplement pas ainsi pour les foncteurs. Supprimez l'argument fictif. –
L'argument fictif que j'ai ajouté à 'g' était de démontrer le comportement étrange de' std :: for_each'. Appeler 'g' avec un' wstring str' comme 'g (str)' fonctionne comme un charme, mais pas dans 'std :: for_each'. Dans mon cas, utiliser boost :: algorithm :: trim' directement en tant que foncteur est impossible sans astuces, car son second argument est optionnel (un std :: locale) – overcoder
@Overcoder: c'est parce que 'g (str)' immédiatement devient 'g (str, 0)' - l'argument par défaut est juste un code de génération de sucre. –