2011-10-20 4 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' 절을 제거하고 알고리즘 절을 변경했습니다 : '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의 피닉스 신 버전을 도입했습니다. 아마도 이것이 문제입니다. 답장을 보내 주셔서 감사합니다. @Ylisar. –