繁体   English   中英

无法将boost :: lambda :: ...转换为long long unsigned int

[英]cannot convert boost::lambda::… to long long unsigned int

我有一个使用boost 1.56标头的简单程序:

#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <algorithm>
#include <iostream>

int main(int argc, char* args[])
{
  size_t a[] = { 1, 2, 3, 4 };
  size_t b[] = { 5, 6, 7, 8 };
  std::transform(a, a+4, b, a, (boost::lambda::_1 + boost::lambda::_2));
  for (int i=0; i<4; ++i)
    std::cout << a[i] << ", ";
  std::cout << std::endl;

  return 0;
}

它是由Debian Linux上的g ++ - 4.9.1编译的,运行良好,适用于32位和64位架构。

也是i686-w64-mingw32-g ++(4.9.1)交叉编译并运行良好。

但x86_64-w64-mingw32-g ++(4.9.1)无法对64位架构进行交叉编译,如下所示:

$ x86_64-w64-mingw32-g++ -I/opt/win64/include transform.cpp -static
In file included from /usr/lib/gcc/x86_64-w64-mingw32/4.9-win32/include/c++/algorithm:62:0,
             from /opt/win64/include/boost/core/swap.hpp:25,
             from /opt/win64/include/boost/utility/swap.hpp:15,
             from /opt/win64/include/boost/tuple/detail/tuple_basic.hpp:40,
             from /opt/win64/include/boost/tuple/tuple.hpp:28,
             from /opt/win64/include/boost/lambda/core.hpp:28,
             from /opt/win64/include/boost/lambda/lambda.hpp:14,
             from transform.cpp:1:
/usr/lib/gcc/x86_64-w64-mingw32/4.9-win32/include/c++/bits/stl_algo.h: In instantiation of ‘_OIter std::transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation) [with _IIter1 = long long unsigned int*; _IIter2 = long long unsigned int*; _OIter = long long unsigned int*; _BinaryOperation =    boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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> > >]’:
transform.cpp:11:92:   required from here
/usr/lib/gcc/x86_64-w64-mingw32/4.9-win32/include/c++/bits/stl_algo.h:4202:12: error: cannot convert ‘boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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> >::sig<boost::tuples::tuple<long long unsigned int&, long long unsigned int&, 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> >::type {aka boost::lambda::detail::return_type_deduction_failure<boost::lambda::detail::return_type_2_arithmetic_phase_3<long long unsigned int, long long unsigned int> >}’ to ‘long long unsigned int’ in assignment
  *__result = __binary_op(*__first1, *__first2);
            ^
In file included from /opt/win64/include/boost/lambda/lambda.hpp:22:0,
                 from transform.cpp:1:
/opt/win64/include/boost/lambda/detail/operator_lambda_func_base.hpp: In instantiation of ‘RET boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>, Args>::call(A&, B&, C&, Env&) const [with RET = boost::lambda::detail::return_type_deduction_failure<boost::lambda::detail::return_type_2_arithmetic_phase_3<long long unsigned int, long long unsigned int> >; A = long long unsigned int; B = long long unsigned int; C = const boost::tuples::null_type; Env = const boost::tuples::null_type; Args = boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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>]’:
/opt/win64/include/boost/lambda/detail/lambda_functors.hpp:211:39:   required from ‘typename boost::lambda::lambda_functor<Base>::inherited::sig<boost::tuples::tuple<A&, B&> >::type boost::lambda::lambda_functor<Base>::operator()(A&, B&) const [with A = long long unsigned int; B = long long unsigned int; T = boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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> >; typename boost::lambda::lambda_functor<Base>::inherited::sig<boost::tuples::tuple<A&, B&> >::type = boost::lambda::detail::return_type_deduction_failure<boost::lambda::detail::return_type_2_arithmetic_phase_3<long long unsigned int, long long unsigned int> >]’
/usr/lib/gcc/x86_64-w64-mingw32/4.9-win32/include/c++/bits/stl_algo.h:4202:46:   required from ‘_OIter std::transform(_IIter1, _IIter1, _IIter2, _OIter, _BinaryOperation) [with _IIter1 = long long unsigned int*; _IIter2 = long long unsigned int*; _OIter = long long unsigned int*; _BinaryOperation = boost::lambda::lambda_functor<boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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> > >]’
transform.cpp:11:92:   required from here
/opt/win64/include/boost/lambda/detail/operator_lambda_func_base.hpp:160:72: error: could not convert ‘(boost::lambda::detail::select<boost::lambda::placeholder<1>, long long unsigned int, long long unsigned int, const boost::tuples::null_type, const boost::tuples::null_type>((* & boost::tuples::get<0, boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::cons<boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, boost::tuples::null_type> >((* &((const boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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> >*)this)->boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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> >::args.boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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>::<anonymous>))), (* & a), (* & b), (* & c), (* & env)) + boost::lambda::detail::select<boost::lambda::placeholder<2>, long long unsigned int, long long unsigned int, const boost::tuples::null_type, const boost::tuples::null_type>((* & boost::tuples::get<1, boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::tuples::cons<boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, boost::tuples::null_type> >((* &((const boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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> >*)this)->boost::lambda::lambda_functor_base<boost::lambda::arithmetic_action<boost::lambda::plus_action>, boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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> >::args.boost::tuples::tuple<boost::lambda::lambda_functor<boost::lambda::placeholder<1> >, boost::lambda::lambda_functor<boost::lambda::placeholder<2> >, 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>::<anonymous>))), (* & a), (* & b), (* & c), (* & env)))’ from ‘long long unsigned int’ to ‘boost::lambda::detail::return_type_deduction_failure<boost::lambda::detail::return_type_2_arithmetic_phase_3<long long unsigned int, long long unsigned int> >’
        detail::select(boost::tuples::get<1>(args), CALL_ACTUAL_ARGS); \
                                                                    ^
/opt/win64/include/boost/lambda/detail/operator_lambda_func_base.hpp:206:1: note: in expansion of macro ‘BOOST_LAMBDA_BINARY_ACTION’
 BOOST_LAMBDA_BINARY_ACTION(+,arithmetic_action<plus_action>)
 ^

是的,TL; DR

基本上出现了问题, boost::lambda::_1 + boost::lambda::_2size_t结合使用(其他类型如int似乎没问题)。

为什么会有问题? 是一个提升中的错误?

如果类型被声明为unsigned long long而不是size_t那么这在Coliru上是可重现的。 long long也失败了。

这看起来像是一个提升中的错误。 它们用于操作员返回类型推导的大规模复杂模板机制 (很可能在C ++ 11中很可能完全被decltype废弃)不支持long longunsigned long long (它在写入C ++标准之前写得很好) )。 问题只出现在64位MinGW中的size_t ,因为这是唯一的long为32位但size_t需要为64位的平台,因此需要使用long long

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM