2012-09-06 2 views
3

karma를 사용하여 boost :: shared_ptrs의 벡터에 들어있는 구조체의 출력을 생성하는 데 문제가 있습니다. 컴파일하지 않는 int를 사용하는 작은 테스트 케이스가있다. 나는이 케이스를 처리하기 위해 deref_iterator 커스터마이징 포인트를 사용할 수 있다고 생각했었다. 또는 아마도 아웃 오브 더 박스 정신은 컨테이너가 포인터 타입을 가지고 있고 여분의 역 참조를한다는 것을 알아 차릴 것이다. 컴파일 오류가 여기에있다karma를 사용하여 포인터 벡터에 대한 출력 생성

#include <boost/spirit/include/karma.hpp> 
#include <boost/shared_ptr.hpp> 
#include <vector> 

typedef boost::shared_ptr<int> ptr; 
typedef std::vector<ptr> vec; 

namespace boost { 
namespace spirit { 
namespace traits { 

// specialise how iterators into containers of pointers are dereferenced 
template <> 
struct deref_iterator< typename container_iterator< vec const >::type > 
{ 
    typedef int type; 

    static 
    type 
    call(typename container_iterator< vec const >::type & it) { 
     return **it; 
    } 
}; 

} // namespace traits 
} // namespace spirit 
} // namespace boost 



int 
main() { 
    vec v; 
    v.push_back(ptr(new int(1))); 
    v.push_back(ptr(new int(2))); 
    v.push_back(ptr(new int(3))); 

    using namespace boost::spirit::karma; 
    using boost::spirit::ascii::space; 

    generate_delimited(
     std::ostream_iterator<char>(std::cout), 
     *int_, 
     space, 
     v 
    ); 

    return 0; 
} 

과 : 어쨌든 여기에 테스트 케이스의

...patience... 
...patience... 
...found 1986 targets... 
...updating 3 targets... 
gcc.compile.c++ /home/john/Dev/Bio/bin/Bio/gcc-4.6/release/src/spirit/vector-of-ptrs.o 
In file included from /home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/numeric/bool_policies.hpp:16:0, 
from /home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/numeric/bool.hpp:29, 
from /home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/numeric.hpp:13, 
from /home/john/src/boost/boost_1_51_0/boost/spirit/home/karma.hpp:15, 
from /home/john/src/boost/boost_1_51_0/boost/spirit/include/karma.hpp:16, 
from src/spirit/vector-of-ptrs.cpp:1: 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/numeric/detail/numeric_utils.hpp: In static member function ‘static boost::shared_ptr< 
     int> boost::spirit::traits::absolute_value<boost::shared_ptr<int>, void>::call(boost::shared_ptr<int>)’: 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/numeric/detail/numeric_utils.hpp:149:41: instantiated from ‘boost::spirit::traits::absolute_value<boost::shared_ptr<int> >::ame boost 
    ::spirit::traits::absolute_value<T>::type = boost::shared_ptr<int> boost::spirit::traits::get_absolute_value(boost::shared_ptr<int>)’ 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/numeric/int.hpp:213:57: instantiated from ‘static bool boost::spirit::karma::any_int_generator< 
     int, boost::spirit::unused_type, boost::spirit::unused_type, 10u, false 
    >::insert_int(boost::spirit::karma::detail::output_iterator<ostream_iterator<char>, mpl_::int_<0>, boost::spirit::unused_type> &, const boost::shared_ptr<int> &)’ 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/numeric/int.hpp:242:39: instantiated from ‘static bool boost::spirit::karma::any_int_generator< 
     int, boost::spirit::unused_type, boost::spirit::unused_type, 10u, false 
    >::generate(
     boost::spirit::karma::detail::output_iterator<ostream_iterator<char>, mpl_::int_<0>, boost::spirit::unused_type> &, boost::spirit::context< 
      boost::fusion::cons<const vector<boost::shared_ptr<int> > &, boost::fusion::nil>, boost::spirit::locals<> > &, const boost::spirit::karma::any_space<boost::spirit::char_encoding::ascii> & 
     , const boost::shared_ptr<int> &)’ 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/detail/fail_function.hpp:36:62: instantiated from ‘bool boost::spirit::karma::detail::fail_function< 
     boost::spirit::karma::detail::output_iterator<ostream_iterator<char>, mpl_::int_<0>, boost::spirit::unused_type>, boost::spirit::context< 
      boost::fusion::cons<const vector<boost::shared_ptr<int> > &, boost::fusion::nil>, boost::spirit::locals<> >, boost::spirit::karma::any_space<boost::spirit::char_encoding::ascii> > 
    ::operator()(const boost::spirit::karma::any_int_generator<int, boost::spirit::unused_type, boost::spirit::unused_type, 10u, false> &, const boost::shared_ptr<int> &) const’ 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/detail/pass_container.hpp:274:13: instantiated from ‘bool boost::spirit::karma::detail::pass_container< 
     boost::spirit::karma::detail::fail_function< 
      boost::spirit::karma::detail::output_iterator<ostream_iterator<char>, mpl_::int_<0>, boost::spirit::unused_type>, boost::spirit::context< 
       boost::fusion::cons<const vector<boost::shared_ptr<int> > &, boost::fusion::nil>, boost::spirit::locals<> >, boost::spirit::karma::any_space<boost::spirit::char_encoding::ascii> >, 
     vector<boost::shared_ptr<int> >, boost::spirit::karma::detail::indirect_iterator<vector<boost::shared_ptr<int> >::const_iterator>, mpl_::bool_<false> 
    >::dispatch_container(const boost::spirit::karma::any_int_generator<int, boost::spirit::unused_type, boost::spirit::unused_type, 10u, false> &, mpl_::mpl_::bool_<false>) const’ 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/detail/pass_container.hpp:321:61: [ skipping 2 instantiation contexts ] 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/operator/kleene.hpp:53:32: instantiated from ‘bool boost::spirit::karma::base_kleene< 
     boost::spirit::karma::any_int_generator<int, boost::spirit::unused_type, boost::spirit::unused_type, 10u, false>, mpl_::bool_<false>, boost::spirit::karma::kleene< 
      boost::spirit::karma::any_int_generator<int, boost::spirit::unused_type, boost::spirit::unused_type, 10u, false> > 
    >::generate_subject(
     boost::spirit::karma::detail::pass_container< 
      boost::spirit::karma::detail::fail_function< 
       boost::spirit::karma::detail::output_iterator<ostream_iterator<char>, mpl_::int_<0>, boost::spirit::unused_type>, boost::spirit::context< 
        boost::fusion::cons<const vector<boost::shared_ptr<int> > &, boost::fusion::nil>, boost::spirit::locals<> >, boost::spirit::karma::any_space<boost::spirit::char_encoding::ascii> > 
      , vector<boost::shared_ptr<int> >, boost::spirit::karma::detail::indirect_iterator<vector<boost::shared_ptr<int> >::const_iterator>, mpl_::bool_<false> >, const vector< 
      boost::shared_ptr<int> > &, mpl_::mpl_::bool_<false>) const’ 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/operator/kleene.hpp:126:17: instantiated from ‘bool boost::spirit::karma::base_kleene< 
     boost::spirit::karma::any_int_generator<int, boost::spirit::unused_type, boost::spirit::unused_type, 10u, false>, mpl_::bool_<false>, boost::spirit::karma::kleene< 
      boost::spirit::karma::any_int_generator<int, boost::spirit::unused_type, boost::spirit::unused_type, 10u, false> > 
    >::generate(
     boost::spirit::karma::detail::output_iterator<ostream_iterator<char>, mpl_::int_<0>, boost::spirit::unused_type> &, boost::spirit::context< 
      boost::fusion::cons<const vector<boost::shared_ptr<int> > &, boost::fusion::nil>, boost::spirit::locals<> > &, const boost::spirit::karma::any_space<boost::spirit::char_encoding::ascii> & 
     , const vector<boost::shared_ptr<int> > &) const’ 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/generate.hpp:161:53: instantiated from ‘bool boost::spirit::karma::generate_delimited(
     boost::spirit::karma::detail::output_iterator<ostream_iterator<char>, mpl_::int_<0> > &, const boost::proto::exprns_::expr< 
      boost::proto::tagns_::tag::dereference, boost::proto::argsns_::list1<const boost::spirit::terminal<boost::spirit::tag::int_> &>, 1l> &, const boost::proto::exprns_::expr< 
      boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l> &, boost::spirit 
     ::karma::delimit_flag::enum_type, const vector<boost::shared_ptr<int> > &)’ 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/generate.hpp:185:82: instantiated from ‘bool boost::spirit::karma::generate_delimited(
     ostream_iterator<char> &, const boost::proto::exprns_::expr<boost::proto::tagns_::tag::dereference, boost::proto::argsns_::list1<const boost::spirit::terminal<boost::spirit::tag::int_> &>, 
      1l> &, const boost::proto::exprns_::expr< 
      boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l> &, boost::spirit 
     ::karma::delimit_flag::enum_type, const vector<boost::shared_ptr<int> > &)’ 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/generate.hpp:227:48: instantiated from ‘bool boost::spirit::karma::generate_delimited(
     const ostream_iterator<char> &, const boost::proto::exprns_::expr< 
      boost::proto::tagns_::tag::dereference, boost::proto::argsns_::list1<const boost::spirit::terminal<boost::spirit::tag::int_> &>, 1l> &, const boost::proto::exprns_::expr< 
      boost::proto::tagns_::tag::terminal, boost::proto::argsns_::term<boost::spirit::tag::char_code<boost::spirit::tag::space, boost::spirit::char_encoding::ascii> >, 0l> &, const vector< 
      boost::shared_ptr<int> > &)’ 
src/spirit/vector-of-ptrs.cpp:46:2: instantiated from here 
/home/john/src/boost/boost_1_51_0/boost/spirit/home/karma/numeric/detail/numeric_utils.hpp:60:26: error: No match for ‘fabs(boost::shared_ptr<int> &)’ 

STL Decryptor reminder: 
    Use the /cand:L option to see all suppressed template candidates 

    "/home/john/src/stlfilt/gfilt" -ftemplate-depth-128 -Wno-deprecated -Wno-unused -Wno-error -O3 -finline-functions -Wno-inline -Wall -fPIC -Wno-deprecated -Wno-unused -DBOOST_FILESYSTEM_VERSION=3 -DNDEBUG -DWITH_NONAMESPACES -DXML_LIBRARY -I"../Bio" -I"../Hmm" -I"/home/john/src/boost/boost_1_51_0" -c -o "/home/john/Dev/Bio/bin/Bio/gcc-4.6/release/src/spirit/vector-of-ptrs.o" "src/spirit/vector-of-ptrs.cpp" 

...failed gcc.compile.c++ /home/john/Dev/Bio/bin/Bio/gcc-4.6/release/src/spirit/vector-of-ptrs.o... 
...removing /home/john/Dev/Bio/bin/Bio/gcc-4.6/release/src/spirit/vector-of-ptrs.o 
...skipped <p/home/john/Dev/Bio/bin/Bio/gcc-4.6/release>spirit-vector-of-ptrs for lack of <p/home/john/Dev/Bio/bin/Bio/gcc-4.6/release>src/spirit/vector-of-ptrs.o... 
...failed updating 1 target... 
...skipped 1 target... 

답변

6

이 실험의 비트가 예상 전문화가 instantiatied되지 않은 이유에 나를 인도 : 반복자가있다 생성자 표현의 평가 중 어딘가에 포장 된 (karma::detail::indirect_iterator).

namespace boost { 
namespace spirit { 
namespace traits { 

    // specialise how iterators into containers of pointers are dereferenced 
    template <> 
     struct deref_iterator< karma::detail::indirect_iterator<vec::const_iterator> > 
    { 
     typedef karma::detail::indirect_iterator<vec::const_iterator> It; 
     typedef int type; 

     static type call(It const & it) { 
      return **it; 
     } 
    }; 

} // namespace traits 
} // namespace spirit 
} // namespace boost 
+0

감사를 다시 : 여기

은 나를 위해 작동 수정합니다. 이것은 나를 위해 너무 작동합니다. 나는 항상이 문제들을 문서를 읽음으로써 해결하려고 노력한다. AFAICS 나는 거기에서이 답을 결코 찾을 수 없었다. 앞으로는 초고속 컴파일러 오류 메시지에 더 많은 시간을 할애 할 것입니다. 대답은 karma :: detail 네임 스페이스의 일부 구현 세부 사항에 의존하는 것처럼 보입니다.이 네임 스페이스는 깨지기 쉽지만 작동합니다. – John

+0

동의합니다. 나는 [spirit-general] 메일 링리스트에서이 놀라운 행동에 관한 질문을 게시하는 것을 고려해 보았습니다. (문서가 부족하거나 유출 된 구현 세부 정보를 통해 회귀가 될 수 있습니다.) 아마 당신은 메일 링리스트를 확인하기위한 더 많은 동기를 찾을 수있을 것입니다 :) – sehe