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 esdie 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 intGenau 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);