2014-09-20 4 views
1

У меня есть простая программа, используя подталкивание 1,56 заголовки:не может преобразовать повышение :: лямбда :: ... долго долго неподписанных INT

#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; 
} 

, который составлен г ++ - 4.9.1 на Debian Linux и работает отлично, как для 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::_2 в сочетании с size_t (другие типы, такие как int, похоже, все в порядке).

Почему возникает проблема? является ли ошибка в повышении?

+1

Что произойдет, если вы используете массивы беззнаковых длинных длин на других платформах, а не size_t? –

+0

@ T.C. Я получаю ту же самую длинную ошибку. – mariusm

ответ

3

Это воспроизводимое по Coliru if the types are declared unsigned long long instead of size_t. long long также терпит неудачу.

Это похоже на ошибку в boost. Их massively complicated template machinery for operator return type deduction (по всей вероятности, в основном, если не полностью устарели decltype в C++ 11) не поддерживает long long или unsigned long long (он был написан задолго до того, как был добавлен в стандарт C++). Проблема проявилась только в size_t в 64-битном MinGW, потому что это единственная платформа, на которой long 32 бит, но size_t должен быть 64 бит, что требует использования long long.

+0

Я думаю, что проблема заключается в нахождении общего/продвинутого типа операции (арифметическое выражение) на двух 'unsigned long long' в пределах их вычитания типа возврата. – dyp

Смежные вопросы