boost::variant printer



  • Hallo,
    ich habe noch eine Frage zum Template boost::variant.
    Ich habe folgenden Code geschrieben:

    typedef uint32_t int32;
    typedef float float32;
    typedef char char8;
    typedef std::basic_string<char8> string;
    typedef std::vector<string> List;
    
    inline std::ostream& operator<<(std::ostream &ostream, const List &list)
    {
    	return (ostream << boost::algorithm::join<List, string>(list, ":"));
    }
    
    typedef boost::variant<
    int32,
    float32,
    string,
    bool,
    char8,
    List
    > ValueBase;
    

    Für den Typ "List" habe ich extra den <<-Operator überladen, damit ich ein Objekt des variant-Typs in cout ausgeben kann:

    std::cout << ValueBase() << std::endl;
    

    Dieser Code erzeugt jedoch eine Menge Fehlermeldungen im Zusammenhang mit boost::detail::variant::printer und auch dem Typ List. So wie ich das sehe, verwendet boost::detail::variant::printer jedoch den stink normalen <<-Operator.
    Wieso funktioniert das dann nicht?

    /usr/include/boost-1_46/boost/variant/detail/variant_io.hpp: In member function ‘void boost::detail::variant::printer<OStream>::operator()(const T&) const [with T = std::vector<std::basic_string<char> >, OStream = std::basic_ostream<char>]’:
    /usr/include/boost-1_46/boost/variant/variant.hpp:832:32: instantiated from ‘boost::detail::variant::invoke_visitor<Visitor>::result_type boost::detail::variant::invoke_visitor<Visitor>::internal_visit(T&, int) [with T = const std::vector<std::basic_string<char> >, Visitor = boost::detail::variant::printer<std::basic_ostream<char> >, boost::detail::variant::invoke_visitor<Visitor>::result_type = void]’
    /usr/include/boost-1_46/boost/variant/detail/visitation_impl.hpp:130:9: instantiated from ‘typename Visitor::result_type boost::detail::variant::visitation_impl_invoke_impl(int, Visitor&, VoidPtrCV, T*, mpl_::true_) [with Visitor = boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char> > >, VoidPtrCV = const void*, T = std::vector<std::basic_string<char> >, typename Visitor::result_type = void, mpl_::true_ = mpl_::bool_<true>]’
    /usr/include/boost-1_46/boost/variant/detail/visitation_impl.hpp:173:9: instantiated from ‘typename Visitor::result_type boost::detail::variant::visitation_impl_invoke(int, Visitor&, VoidPtrCV, T*, NoBackupFlag, int) [with Visitor = boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char> > >, VoidPtrCV = const void*, T = std::vector<std::basic_string<char> >, NoBackupFlag = boost::variant<unsigned int, float, std::basic_string<char>, bool, char, std::vector<std::basic_string<char> > >::has_fallback_type_, typename Visitor::result_type = void]’
    /usr/include/boost-1_46/boost/variant/detail/visitation_impl.hpp:260:1: instantiated from ‘typename Visitor::result_type boost::detail::variant::visitation_impl(int, int, Visitor&, VoidPtrCV, mpl_::false_, NoBackupFlag, Which*, step0*) [with Which = mpl_::int_<0>, step0 = boost::detail::variant::visitation_impl_step<boost::mpl::l_iter<boost::mpl::l_item<mpl_::long_<6l>, unsigned int, boost::mpl::l_item<mpl_::long_<5l>, float, boost::mpl::l_item<mpl_::long_<4l>, std::basic_string<char>, boost::mpl::l_item<mpl_::long_<3l>, bool, boost::mpl::l_item<mpl_::long_<2l>, char, boost::mpl::l_item<mpl_::long_<1l>, std::vector<std::basic_string<char> >, boost::mpl::l_end> > > > > > >, boost::mpl::l_iterboost::mpl::l\_end >, Visitor = boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char> > >, VoidPtrCV = const void*, NoBackupFlag = boost::variant<unsigned int, float, std::basic_string<char>, bool, char, std::vector<std::basic_string<char> > >::has_fallback_type_, typename Visitor::result_type = void, mpl_::false_ = mpl_::bool_<false>]’
    /usr/include/boost-1_46/boost/variant/variant.hpp:1776:13: instantiated from ‘static typename Visitor::result_type boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::internal_apply_visitor_impl(int, int, Visitor&, VoidPtrCV) [with Visitor = boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char> > >, VoidPtrCV = const void*, T0_ = unsigned int, T1 = float, T2 = std::basic_string<char>, T3 = bool, T4 = char, T5 = std::vector<std::basic_string<char> >, T6 = boost::detail::variant::void_, T7 = boost::detail::variant::void_, T8 = boost::detail::variant::void_, T9 = boost::detail::variant::void_, T10 = boost::detail::variant::void_, T11 = boost::detail::variant::void_, T12 = boost::detail::variant::void_, T13 = boost::detail::variant::void_, T14 = boost::detail::variant::void_, T15 = boost::detail::variant::void_, T16 = boost::detail::variant::void_, T17 = boost::detail::variant::void_, T18 = boost::detail::variant::void_, T19 = boost::detail::variant::void_, typename Visitor::result_type = void]’
    /usr/include/boost-1_46/boost/variant/variant.hpp:1798:13: instantiated from ‘typename Visitor::result_type boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::internal_apply_visitor(Visitor&) const [with Visitor = boost::detail::variant::invoke_visitor<boost::detail::variant::printer<std::basic_ostream<char> > >, T0_ = unsigned int, T1 = float, T2 = std::basic_string<char>, T3 = bool, T4 = char, T5 = std::vector<std::basic_string<char> >, T6 = boost::detail::variant::void_, T7 = boost::detail::variant::void_, T8 = boost::detail::variant::void_, T9 = boost::detail::variant::void_, T10 = boost::detail::variant::void_, T11 = boost::detail::variant::void_, T12 = boost::detail::variant::void_, T13 = boost::detail::variant::void_, T14 = boost::detail::variant::void_, T15 = boost::detail::variant::void_, T16 = boost::detail::variant::void_, T17 = boost::detail::variant::void_, T18 = boost::detail::variant::void_, T19 = boost::detail::variant::void_, typename Visitor::result_type = void]’
    /usr/include/boost-1_46/boost/variant/variant.hpp:1820:52: instantiated from ‘typename Visitor::result_type boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::apply_visitor(Visitor&) const [with Visitor = boost::detail::variant::printer<std::basic_ostream<char> >, T0_ = unsigned int, T1 = float, T2 = std::basic_string<char>, T3 = bool, T4 = char, T5 = std::vector<std::basic_string<char> >, T6 = boost::detail::variant::void_, T7 = boost::detail::variant::void_, T8 = boost::detail::variant::void_, T9 = boost::detail::variant::void_, T10 = boost::detail::variant::void_, T11 = boost::detail::variant::void_, T12 = boost::detail::variant::void_, T13 = boost::detail::variant::void_, T14 = boost::detail::variant::void_, T15 = boost::detail::variant::void_, T16 = boost::detail::variant::void_, T17 = boost::detail::variant::void_, T18 = boost::detail::variant::void_, T19 = boost::detail::variant::void_, typename Visitor::result_type = void]’
    /usr/include/boost-1_46/boost/variant/detail/variant_io.hpp:88:5: instantiated from ‘std::basic_ostream<_CharT, _Traits>& boost::operator<<(std::basic_ostream<_CharT, _Traits>&, const boost::variant<U0, U1, U2, U3, U4, U5, U6, U7, U8, U9, U10, U11, U12, U13, U14, U15, U16, U17, U18, U19>&) [with E = char, T = std::char_traits<char>, U0 = unsigned int, U1 = float, U2 = std::basic_string<char>, U3 = bool, U4 = char, U5 = std::vector<std::basic_string<char> >, U6 = boost::detail::variant::void_, U7 = boost::detail::variant::void_, U8 = boost::detail::variant::void_, U9 = boost::detail::variant::void_, U10 = boost::detail::variant::void_, U11 = boost::detail::variant::void_, U12 = boost::detail::variant::void_, U13 = boost::detail::variant::void_, U14 = boost::detail::variant::void_, U15 = boost::detail::variant::void_, U16 = boost::detail::variant::void_, U17 = boost::detail::variant::void_, U18 = boost::detail::variant::void_, U19 = boost::detail::variant::void_]’
    bla.cpp:164:93: instantiated from here
    /usr/include/boost-1_46/boost/variant/detail/variant_io.hpp:64:9: error: no match for ‘operator<<’ in ‘((const boost::detail::variant::printer<std::basic_ostream<char> >*)this)->boost::detail::variant::printer<std::basic_ostream<char> >::out_ << operand’



  • Guck Dir mal boost::static_visitor<..> an. Hier gibts Bsp's:
    http://www.boost.org/doc/libs/1_48_0/doc/html/variant/tutorial.html#variant.tutorial.basic



  • Dass es mit einem static_visitor geht ist ja noch mal eine andere Sache. Die Frage war eher, wieso es nicht schon so funktioniert.


Anmelden zum Antworten