La forme (1) fonctionne mais la forme (2) est refusée à la compilation
avec l'erreur suivante :
no match for operator<< in boost::lambda::operator<<(A&, const
boost::lambda::lambda_functor<Arg>&) [with A = std::ostream, Arg
=boost::lambda::placeholder<1>](((const
boost::lambda::lambda_functor<boost::lambda::placeholder<1> >&)(+
boost::lambda::<unnamed>::_1))) << std::endl
En bref, le problème est que endl est une fonction template dont le type ne peut pas être déduit dans ce contexte. Il existe bien une solution pour contourner le problème qui y est décrite mais je vais garder la forme avec 'n'.
En bref, le problème est que endl est une fonction template dont le type
ne peut pas être déduit dans ce contexte. Il existe bien une solution
pour contourner le problème qui y est décrite mais je vais garder la
forme avec 'n'.
En bref, le problème est que endl est une fonction template dont le type ne peut pas être déduit dans ce contexte. Il existe bien une solution pour contourner le problème qui y est décrite mais je vais garder la forme avec 'n'.
Falk Tannhäuser
Marc Duflot wrote:
J'ai trouvé l'explication suivante: http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?action= browse&id=Suggestions_-_Lambda_Library En bref, le problème est que endl est une fonction template dont le t ype ne peut pas être déduit dans ce contexte. Il existe bien une soluti on pour contourner le problème qui y est décrite mais je vais garder l a forme avec 'n'.
Effectivement, les formes for_each (v.begin(), v.end(), cout << _1 << static_cast<ostream&(*)(os tream&)>(endl)); ou for_each (v.begin(), v.end(), cout << _1 << &endl<char, char_traits<ch ar> >); (ne pas oublier le '&' sous peine de se trouver enseveli sous une avalanc he d'insultes incompréhensibles due à une ambiguïté de surcharge) passent. Mais il est vrai qu'il ne sert à rien de faire un flush (comme le fait endl) à chaque coup - d'un point de vue de performance, c'est même décons eillé. Si nécessaire, on pourra toujours ajouter un 'cout << flush' après le for_each.
Falk
Marc Duflot wrote:
J'ai trouvé l'explication suivante:
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?action= browse&id=Suggestions_-_Lambda_Library
En bref, le problème est que endl est une fonction template dont le t ype
ne peut pas être déduit dans ce contexte. Il existe bien une soluti on
pour contourner le problème qui y est décrite mais je vais garder l a
forme avec 'n'.
Effectivement, les formes
for_each (v.begin(), v.end(), cout << _1 << static_cast<ostream&(*)(os tream&)>(endl));
ou
for_each (v.begin(), v.end(), cout << _1 << &endl<char, char_traits<ch ar> >);
(ne pas oublier le '&' sous peine de se trouver enseveli sous une avalanc he
d'insultes incompréhensibles due à une ambiguïté de surcharge)
passent.
Mais il est vrai qu'il ne sert à rien de faire un flush (comme le fait endl)
à chaque coup - d'un point de vue de performance, c'est même décons eillé.
Si nécessaire, on pourra toujours ajouter un 'cout << flush' après le for_each.
J'ai trouvé l'explication suivante: http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?action= browse&id=Suggestions_-_Lambda_Library En bref, le problème est que endl est une fonction template dont le t ype ne peut pas être déduit dans ce contexte. Il existe bien une soluti on pour contourner le problème qui y est décrite mais je vais garder l a forme avec 'n'.
Effectivement, les formes for_each (v.begin(), v.end(), cout << _1 << static_cast<ostream&(*)(os tream&)>(endl)); ou for_each (v.begin(), v.end(), cout << _1 << &endl<char, char_traits<ch ar> >); (ne pas oublier le '&' sous peine de se trouver enseveli sous une avalanc he d'insultes incompréhensibles due à une ambiguïté de surcharge) passent. Mais il est vrai qu'il ne sert à rien de faire un flush (comme le fait endl) à chaque coup - d'un point de vue de performance, c'est même décons eillé. Si nécessaire, on pourra toujours ajouter un 'cout << flush' après le for_each.
Falk
Gabriel Dos Reis
=?windows-1252?Q?Falk_Tannhäuser?= writes:
| Marc Duflot wrote: | > J'ai trouvé l'explication suivante: | > http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?action=browse&id=Suggestions_-_Lambda_Library | > En bref, le problème est que endl est une fonction template dont le | > type ne peut pas être déduit dans ce contexte. Il existe bien une | > solution pour contourner le problème qui y est décrite mais je vais | > garder la forme avec 'n'. | | Effectivement, les formes | for_each (v.begin(), v.end(), cout << _1 << static_cast<ostream&(*)(ostream&)>(endl)); | ou | for_each (v.begin(), v.end(), cout << _1 << &endl<char, char_traits<char> >);
| Marc Duflot wrote:
| > J'ai trouvé l'explication suivante:
| > http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?action=browse&id=Suggestions_-_Lambda_Library
| > En bref, le problème est que endl est une fonction template dont le
| > type ne peut pas être déduit dans ce contexte. Il existe bien une
| > solution pour contourner le problème qui y est décrite mais je vais
| > garder la forme avec 'n'.
|
| Effectivement, les formes
| for_each (v.begin(), v.end(), cout << _1 << static_cast<ostream&(*)(ostream&)>(endl));
| ou
| for_each (v.begin(), v.end(), cout << _1 << &endl<char, char_traits<char> >);
| Marc Duflot wrote: | > J'ai trouvé l'explication suivante: | > http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?action=browse&id=Suggestions_-_Lambda_Library | > En bref, le problème est que endl est une fonction template dont le | > type ne peut pas être déduit dans ce contexte. Il existe bien une | > solution pour contourner le problème qui y est décrite mais je vais | > garder la forme avec 'n'. | | Effectivement, les formes | for_each (v.begin(), v.end(), cout << _1 << static_cast<ostream&(*)(ostream&)>(endl)); | ou | for_each (v.begin(), v.end(), cout << _1 << &endl<char, char_traits<char> >);
C'est d'une élégance foudroyante, n'est-ce pas ?
-- Gaby
Marc Duflot
Falk Tannhäuser wrote:
Marc Duflot wrote:
J'ai trouvé l'explication suivante: http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?action=browse&id=Suggestions_-_Lambda_Library En bref, le problème est que endl est une fonction template dont le type ne peut pas être déduit dans ce contexte. Il existe bien une solution pour contourner le problème qui y est décrite mais je vais garder la forme avec 'n'.
Effectivement, les formes for_each (v.begin(), v.end(), cout << _1 << static_cast<ostream&(*)(ostream&)>(endl)); ou for_each (v.begin(), v.end(), cout << _1 << &endl<char, char_traits<char> >); (ne pas oublier le '&' sous peine de se trouver enseveli sous une avalanche d'insultes incompréhensibles due à une ambiguïté de surcharge) passent.
Pour la curiosité, voici un hack qui permet de garder la syntaxe dans l'expression lambda
Le endl de la forme (2) est trouvé dans boost::lambda.
Bien sûr, je ne conseille pas de faire ça en pratique car un « using namespace std; » bien placé rend l'usage de endl ambigu. De plus, si on utilise un basic_ostream<paschar>, ça ne marche plus.
Marc
Falk Tannhäuser wrote:
Marc Duflot wrote:
J'ai trouvé l'explication suivante:
http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?action=browse&id=Suggestions_-_Lambda_Library
En bref, le problème est que endl est une fonction template dont le
type ne peut pas être déduit dans ce contexte. Il existe bien une
solution pour contourner le problème qui y est décrite mais je vais
garder la forme avec 'n'.
Effectivement, les formes
for_each (v.begin(), v.end(), cout << _1 <<
static_cast<ostream&(*)(ostream&)>(endl));
ou
for_each (v.begin(), v.end(), cout << _1 << &endl<char,
char_traits<char> >);
(ne pas oublier le '&' sous peine de se trouver enseveli sous une avalanche
d'insultes incompréhensibles due à une ambiguïté de surcharge)
passent.
Pour la curiosité, voici un hack qui permet de garder la syntaxe dans
l'expression lambda
Le endl de la forme (2) est trouvé dans boost::lambda.
Bien sûr, je ne conseille pas de faire ça en pratique car un « using
namespace std; » bien placé rend l'usage de endl ambigu. De plus, si on
utilise un basic_ostream<paschar>, ça ne marche plus.
J'ai trouvé l'explication suivante: http://www.crystalclearsoftware.com/cgi-bin/boost_wiki/wiki.pl?action=browse&id=Suggestions_-_Lambda_Library En bref, le problème est que endl est une fonction template dont le type ne peut pas être déduit dans ce contexte. Il existe bien une solution pour contourner le problème qui y est décrite mais je vais garder la forme avec 'n'.
Effectivement, les formes for_each (v.begin(), v.end(), cout << _1 << static_cast<ostream&(*)(ostream&)>(endl)); ou for_each (v.begin(), v.end(), cout << _1 << &endl<char, char_traits<char> >); (ne pas oublier le '&' sous peine de se trouver enseveli sous une avalanche d'insultes incompréhensibles due à une ambiguïté de surcharge) passent.
Pour la curiosité, voici un hack qui permet de garder la syntaxe dans l'expression lambda
Le endl de la forme (2) est trouvé dans boost::lambda.
Bien sûr, je ne conseille pas de faire ça en pratique car un « using namespace std; » bien placé rend l'usage de endl ambigu. De plus, si on utilise un basic_ostream<paschar>, ça ne marche plus.