Использование `boost :: phoenix :: static_cast_` в сочетании со стандартной библиотекой

#c #boost #std #boost-phoenix

#c #boost #std #boost-phoenix

Вопрос:

Это ошибка Phoenix v3. Он отлично компилируется с Phoenix v2. Я сделал сообщение об ошибке. Я отмечу этот вопрос как решенный через 2 дня. Спасибо вам всем.

Я пытаюсь сделать короткую lamba с phoenix, но получаю кучу ошибок компиляции. Вот код.

 std::vector<unsigned char> data;
using boost::phoenix::arg_names::_1;
using boost::phoenix::static_cast_;
std::ostringstream oss;
oss << std::hex;
//Doesn't compile
std::for_each(data.begin(),data.end(), oss <<  static_cast_<unsigned int>(_1) );
//Compiles
std::for_each(data.begin(),data.end(), oss << _1 );
  

Теперь я получаю следующую ошибку компиляции из GCC 4.6.1:
/usr/include/boost/utility/result_of.hpp:-1: In instantiation of ‘boost::detail::result_of_nested_result<boost::phoenix::static_cast_eval, boost::phoenix::static_cast_eval(boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::detail::target<unsigned char> >, 0l>amp;, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> >amp;, boost::phoenix::vector2<boost::phoenix::vector2<const boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<std::basic_ostringstream<char>amp;>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::phoenix::tag::static_cast_, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::detail::target<unsigned char> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> > >, 2l> > >, 2l> >*, unsigned charamp;>amp;, const boost::phoenix::default_actionsamp;>)>’:

/usr/include/boost/phoenix/object/static_cast.hpp:29: error: declaration of ‘struct boost::phoenix::static_cast_eval::result<boost::phoenix::static_cast_eval(boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::detail::target<unsigned char> >, 0l>amp;, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> >amp;, boost::phoenix::vector2<boost::phoenix::vector2<const boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<std::basic_ostringstream<char>amp;>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::phoenix::tag::static_cast_, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::detail::target<unsigned char> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> > >, 2l> > >, 2l> >*, unsigned charamp;>amp;, const boost::phoenix::default_actionsamp;>)>’

/usr/include/boost/phoenix/core/detail/preprocessed/call_10.hpp:65: error: no type named ‘type’ in ‘struct boost::result_of<boost::phoenix::static_cast_eval(boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::detail::target<unsigned char> >, 0l>amp;, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> >amp;, boost::phoenix::vector2<boost::phoenix::vector2<const boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::shift_left, boost::proto::argsns_::list2<boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<std::basic_ostringstream<char>amp;>, 0l> >, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::phoenix::tag::static_cast_, boost::proto::argsns_::list2<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::detail::target<unsigned char> >, 0l>, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> > >, 2l> > >, 2l> >*, unsigned charamp;>amp;, const boost::phoenix::default_actionsamp;>)>’

Комментарии:

1. Не могли бы вы опубликовать ссылку на отчет об ошибке, пожалуйста?

2. Для дальнейшего использования, вероятно, это сообщение об ошибке, помеченное как исправленное: svn.boost.org/trac/boost/ticket/6040

Ответ №1:

Оба компилируются здесь как на GCC, так и на MSVC, если бы я попытался это сделать, я бы предположил, что нарушитель:

использование boost:: phoenix:: arg_names:: _1;

Есть и другие заполнители с тем же именем, некоторые импортируются в глобальную область (я полагаю, что один boost :: bind используется, например, в глобальной области). Последняя ошибка, в частности, намекает на это, поскольку, казалось бы, тип, который должен быть мета-функцией, где-то не используется.

Комментарии:

1. Я избавился от этого using предложения и изменил предложение алгоритма на: std::for_each(data.begin(),data.end(), oss << static_cast_<unsigned int>(boost::phoenix::arg_names::_1) ); я получаю те же ошибки. Здесь ( ideone.com/D6SyS ), он компилируется просто отлично. На ideone.com GCC равен 4.3.4, а Boost равен 1.39. Мои — GCC 4.6.1 и Boost 1.47. Они представили новую версию phoenix с 1.47 под названием v3, возможно, это проблема. Спасибо за ваш ответ @Ylisar.