2011-10-20 20 views
1

これはPhoenix v3バグです。これはPhoenix v2でうまくコンパイルされます。 私はバグ報告をしました。 私はこの問題を2日後に解決するとマークします。皆さん、ありがとうございました。標準ライブラリと組み合わせた `boost :: phoenix :: static_cast_`の使用

私はphoenixで短いlambaを作ろうとしていますが、コンパイルエラーがたくさんあります。ここにコードがあります。

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>&, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> >&, 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>&>, 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 char&>&, const boost::phoenix::default_actions&>)>’:

/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>&, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> >&, 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>&>, 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 char&>&, const boost::phoenix::default_actions&>)>’

/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>&, boost::phoenix::actor<boost::proto::exprns_::basic_expr<boost::proto::tag::terminal, boost::proto::argsns_::term<boost::phoenix::argument<1> >, 0l> >&, 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>&>, 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 char&>&, const boost::phoenix::default_actions&>)>’

+0

バグレポートへのリンクを投稿できますか? – ildjarn

+1

今後の参考として、バグレポートはおそらく修正済みとマークされているでしょう:https://svn.boost.org/trac/boost/ticket/6040 – Hossein

答えて

0

私が持っているならば、どちらも、両方のGCC & MSVCにここにコンパイル私はその犯罪者が次のようだと推測します:

using boost::phoenix::arg_names::_1;

非常に同じ名前のプレースホルダがあり、一部はグローバルスコープにインポートされています(私はboost :: bindの使用がグローバルスコープにあると考えています)。最後のエラーは特にこれを示唆しています。メタ関数でなければならない型がどこかで使用されているように見えます。

+0

私はこの 'using'節を取り除き、アルゴリズム節を変更しましたto: 'std :: for_each(data.begin()、data.end()、oss << static_cast_ (boost :: phoenix :: arg_names :: _ 1));' 私は同じエラー。 ここ(http://ideone.com/D6SyS)、それはちょうど良いコンパイル。 ideone.comで GCCは4.3.4、ブーストは1.39です。私のGCC 4.6.1とブースト1.47です。 彼らはv3と呼ばれる1.47のphoenixの新しいバージョンを導入しました。これはおそらく問題です。あなたのお返事ありがとうございます@Ylisar。 –

関連する問題