$include_dir="/home/hyper-archives/boost-users/include"; include("$include_dir/msg-header.inc") ?>
From: Jaakko Järvi (jarvi_at_[hidden])
Date: 2006-05-25 19:33:34
On May 25, 2006, at 6:13 PM, Antonio Piccolboni wrote:
> I just wanted to transform a vector of integers into a vecotr of  
> strings, doesn't seem to be asking much
>
> transform(ilabels.begin(), ilabels.end(), labels.begin(),  
> lexical_cast<string>(_1));
>
> gcc 4.0.2 doesn't like it at all
>
> /usr/include/boost/lexical_cast.hpp:144: error: 'const class  
> boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost 
> ::lambda::bitwise_action<boost::lambda::leftshift_action>,  
> boost::tuples::tuple<std::basic_stringstream<char,  
> std::char_traits<char>, std::allocator<char> >&,  
> boost::lambda::lambda_functor<boost::lambda::placeholder<1> >,  
> boost::tuples::null_type, boost::tuples::null_type,  
> boost::tuples::null_type, boost::tuples::null_type,  
> boost::tuples::null_type, boost::tuples::null_type,  
> boost::tuples::null_type, boost::tuples::null_type> > >' has no  
> member named 'fail'
>
> <begin polemic, use flame retardant>
> Is it only me or does lambda lack orthogonality with anything else?  
> Whenever I use lambda for anything non isomorphic to the the plain  
> vanilla examples, the compiler goes ballistic
> <end polemic>
>
To make the above work, there would have to be an overload of  
lexical_cast function that understands
what _1 is. Lambda and lexical_cast are separate libraries, which  
were developed in isolation of each other,
and neither library has included such an overload. In the general  
case, it is not a realistic expectation that every
function would be overloaded to accept placeholders.
bind helps in many cases. Try:
  boost::lambda::bind(&boost::lexical_cast<std::string, int>, _1)
(assuming that the value type of labels is int)
Best,
   Jaakko