boost::variant



  • Hallo,

    ich wollte gerade boost::variant mit dem typen std::uint32_t und std::uint64_t benutzen.
    wenn ich jetzt aber eine zahl vom typ std::uint32_t bzw. std::uint64_t zuweisen möchte, kracht es.

    boost::variant<std::uint32_t, std::uint64_t> v;
    
    std::uint32_t t = 32;
    
    v = t; // hier kracht es
    

    die fehlermeldung lautet:

    /usr/include/boost/variant/variant.hpp: In Elementfunktion »void boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::convert_construct(T&, int, mpl_::false_) [with T = const int, T0_ = unsigned int, T1 = long unsigned int, T2 = boost::detail::variant::void_, T3 = boost::detail::variant::void_, T4 = boost::detail::variant::void_, T5 = boost::detail::variant::void_, 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_, mpl_::false_ = mpl_::bool_<false>]«:
    /usr/include/boost/variant/variant.hpp:1373:9:    instanziiert von »boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::variant(const T&) [with T = int, T0_ = unsigned int, T1 = long unsigned int, T2 = boost::detail::variant::void_, T3 = boost::detail::variant::void_, T4 = boost::detail::variant::void_, T5 = boost::detail::variant::void_, 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_]«
    /usr/include/boost/variant/variant.hpp:1616:29:    instanziiert von »void boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::assign(const T&) [with T = int, T0_ = unsigned int, T1 = long unsigned int, T2 = boost::detail::variant::void_, T3 = boost::detail::variant::void_, T4 = boost::detail::variant::void_, T5 = boost::detail::variant::void_, 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_]«
    /usr/include/boost/variant/variant.hpp:1626:9:    instanziiert von »boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>& boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>::operator=(const T&) [with T = int, T0_ = unsigned int, T1 = long unsigned int, T2 = boost::detail::variant::void_, T3 = boost::detail::variant::void_, T4 = boost::detail::variant::void_, T5 = boost::detail::variant::void_, 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_, boost::variant<T0, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19> = boost::variant<unsigned int, long unsigned int>]«
    /home/.../Blender_File.cpp:129:78:   instanziiert von hier
    /usr/include/boost/variant/variant.hpp:1300:9: Fehler: Aufruf des überladenen »initialize(void*, const int&)« ist mehrdeutig
    /usr/include/boost/variant/variant.hpp:1300:9: Anmerkung: Kandidaten sind:
    /usr/include/boost/variant/detail/initializer.hpp:89:24: Anmerkung: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, boost::mpl::l_iter<boost::mpl::list2<unsigned int, long unsigned int> > >::initializer_node, mpl_::int_<1> >, Iterator = boost::mpl::l_iter<boost::mpl::list1<long unsigned int> >, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const long unsigned int]
    /usr/include/boost/variant/detail/initializer.hpp:89:24: Anmerkung: static int boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::initialize(void*, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T) [with BaseIndexPair = boost::mpl::pair<boost::detail::variant::initializer_root, mpl_::int_<0> >, Iterator = boost::mpl::l_iter<boost::mpl::list2<unsigned int, long unsigned int> >, boost::detail::variant::make_initializer_node::apply<BaseIndexPair, Iterator>::initializer_node::param_T = const unsigned int]
    

    wisst ihr, ob man das nicht kann, also die beiden typen in eienm variant zu benutzten und gibt es hierfür eine möglichkeit es zu tun?

    danke schon mal

    vario-500



  • Ich wüsste jetzt nicht, wo der Fehler ist. Allerdings frage ich mich schon, warum man so etwas wie variant<uint32,uint64> braucht. Tut es uint64 nicht?



  • ich lese einen pointer aus einer datei, der entweder 32 oder 64 bit haben kann, aber stimmt, ich könnte den 32 bit pointer ja trotzdem in std::uint64_t speichern. ist ja dann egal



  • So wie ich die Fehlermeldung deute, liegt es daran das ein uint32_t implizit in einen uint64_t umgewandelt werden kann.



  • Ist das auch ganz sicher der passende Code zu den Fehlermeldungen? Ich frage mich nämlich, wo das "const int&" aus der Fehlermeldung herkommen soll.



  • Von:

    Anmerkung: Kandidaten sind:
    ... param_T = const long unsigned int
    ... param_T = const unsigned int
    


  • pyhax schrieb:

    Von:

    Anmerkung: Kandidaten sind:
    ... param_T = const long unsigned int
    ... param_T = const unsigned int
    

    Genau dadrüber steht noch

    ... Aufruf des überladenen »initialize(void*, const int&)« ist mehrdeutig

    Und das const int& da sagt mir, dass als zweiter Parameter ein Lvalue vom Typ const signed int verwendet wurde. Es gibt also keinen "perfekten Match".



  • jetzt geht es gerade auf einmal. ich weiß nicht, was ich vorher falsch gemacht hab.

    #include <boost/variant>
    #include <cstdint>
    
    int main(int argc, char** argv) 
    {
    	boost::variant<std::uint32_t, std::uint64_t> v;
    	std::uint32_t ui = 32;
    	v = ui;
    }
    


  • vario-500 schrieb:

    ich lese einen pointer aus einer datei, der entweder 32 oder 64 bit haben kann, aber stimmt, ich könnte den 32 bit pointer ja trotzdem in std::uint64_t speichern. ist ja dann egal

    Was macht man denn mit Pointern, die man aus einer Datei eingelesen hat?



  • vario, das ist ja klar, da du jetzt explizit eine Variable vom Typ uint32_t übergibst. Dein Variant kann den Typ aufnehmen, also klappt das.

    Dein v = 32 klappt deshalb nicht, weil die Konstante 32 vom Compiler erstmal den Typ int bekommt, daher steht im Fehler auch (const int &).
    int kann aber implizit in sowohl uint32_t als auch uint64_t gecastet werden, weshalb sich der Compiler nicht entscheiden kann.

    Eine Lösung wäre, es explizit anzugeben:
    v = static_caststd::uint32\_t(32);


Anmelden zum Antworten