I’ve just come across a compiler error resulting from using boost::result_of with a C++11 lambda.
I wasn’t actually using boost::result_of directly, but provided a lambda as the transforming functor for a boost::transform_iterator, which uses it behind the scenes.
Here’s a small listing that shows the problem:
#include <boost/iterator/transform_iterator.hpp> #include <iostream> int main() { int i[] = {1, 2, 3, 4}; auto square = [](int i) { return i*i; }; auto begin = boost::make_transform_iterator( i, square ); auto end = boost::make_transform_iterator( i+4, square ); }
with Boost 1.48 that yields the following error:
In file included from /usr/include/boost/iterator/transform_iterator.hpp:23:0, from boost-result-of-error-with-lambdas.cpp:2: /usr/include/boost/utility/result_of.hpp: In instantiation of ‘struct boost::detail::result_of_nested_result<main()::, main()::(int&)>’: /usr/include/boost/utility/result_of.hpp:83:8: required from ‘struct boost::detail::tr1_result_of_impl<main()::, main()::(int&), false>’ /usr/include/boost/utility/detail/result_of_iterate.hpp:23:8: required from ‘struct boost::tr1_result_of<main()::(int&)>’ /usr/include/boost/utility/detail/result_of_iterate.hpp:80:8: required from ‘struct boost::result_of<main()::(int&)>’ /usr/include/boost/mpl/eval_if.hpp:38:31: required from ‘struct boost::mpl::eval_if<boost::is_same, boost::result_of<main()::(int&)>, boost::mpl::identity >’ /usr/include/boost/iterator/iterator_adaptor.hpp:160:12: required from ‘struct boost::detail::ia_dflt_help<boost::use_default, boost::result_of<main()::(int&)> >’ /usr/include/boost/iterator/transform_iterator.hpp:50:17: required from ‘struct boost::detail::transform_iterator_base<main()::, int*, boost::use_default, boost::use_default>’ /usr/include/boost/iterator/transform_iterator.hpp:74:9: required from ‘class boost::transform_iterator<main()::, int*, boost::use_default, boost::use_default>’ boost-result-of-error-with-lambdas.cpp:10:60: required from here /usr/include/boost/utility/result_of.hpp:79:8: error: no class template named ‘result’ in ‘struct main()::’
The problem is that boost::result_of doesn’t play well with C++11 lambdas straight off, fortunately the solution is simple: define preprocessor symbol BOOST_RESULT_OF_USE_DECLTYPE and all is well again 🙂
Thanks to Akira Takahashi for the solution in this response to the same issue triggered from the range adaptors.
errrrrrrrr…….. like the photos x