简体   繁体   中英

Does boost::variant support 64bit integers?

I tried to use boost::variant combined with a 64 bit integer. Unfortunately it didn't work. Is there any way to fix this? Or is my boost version just to old? I'm using V1.45.

This declaration works:

std::vector< boost::variant<int, float64_t> > vec2;

This declaration doesn't work:

std::vector< boost::variant<long long int, float64_t> > vec2;

Edit

It's an compiler error:

error C2668: 'boost::detail::variant::make_initializer_node::apply<BaseIndexPair,Iterator>::initializer_node::initialize' : ambiguous call to overloaded function
1>          with
1>          [
1>              BaseIndexPair=boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root,boost::mpl::int_<0>>,boost::mpl::l_iter<boost::mpl::list3<__int64,double,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>::initializer_node,boost::mpl::int_<1>>,boost::mpl::l_iter<boost::mpl::list2<double,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>::initializer_node,boost::mpl::int_<2>>,
1>              Iterator=boost::mpl::l_iter<boost::mpl::list1<std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>
1>          ]
1>          boost-1_45_0\boost\variant\detail\initializer.hpp(89): could be 'int boost::detail::variant::make_initializer_node::apply<BaseIndexPair,Iterator>::initializer_node::initialize(void *,const __int64 &)'
1>          with
1>          [
1>              BaseIndexPair=boost::mpl::pair<boost::detail::variant::initializer_root,boost::mpl::int_<0>>,
1>              Iterator=boost::mpl::l_iter<boost::mpl::list3<__int64,double,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>
1>          ]
1>          boost-1_45_0\boost\variant\detail\initializer.hpp(89): or       'int boost::detail::variant::make_initializer_node::apply<BaseIndexPair,Iterator>::initializer_node::initialize(void *,const double &)'
1>          with
1>          [
1>              BaseIndexPair=boost::mpl::pair<boost::detail::variant::make_initializer_node::apply<boost::mpl::pair<boost::detail::variant::initializer_root,boost::mpl::int_<0>>,boost::mpl::l_iter<boost::mpl::list3<__int64,double,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>>::initializer_node,boost::mpl::int_<1>>,
1>              Iterator=boost::mpl::l_iter<boost::mpl::list2<double,std::basic_string<char,std::char_traits<char>,std::allocator<char>>>>
1>          ]
1>          while trying to match the argument list '(void *, const int)'
1>          boost-1_45_0\boost\variant\variant.hpp(1373) : see reference to function template instantiation 'void boost::variant<T0_,T1,T2>::convert_construct<const T>(T &,int,boost::mpl::false_)' being compiled
1>          with
1>          [
1>              T0_=__int64,
1>              T1=float64_t,
1>              T2=std::string,
1>              T=int
1>          ]
1>          (1900) : see reference to function template instantiation 'boost::variant<T0_,T1,T2>::variant<int>(const T &)' being compiled
1>          with
1>          [
1>              T0_=__int64,
1>              T1=float64_t,
1>              T2=std::string,
1>              T=int
1>          ]

Edit

The error was in the code not posted. @hvd has found the fault anyway. I must explicitly name the type - but only if it's an int64.

No error:

std::vector <boost::variant <int, float64_t> > vec;
vec.push_back ( 22 );

Compiler error:

std::vector <boost::variant <__int64, float64_t> > vec;
vec.push_back ( 22 );

No error:

std::vector <boost::variant <__int64, float64_t> > vec;
vec.push_back ( (__int64) 22 );

To give a short answer: boost::variant does support 64bit integers.

But if the value assigned to boost::variant is ambiguous this can lead to compiler errors (eg the boost::variant does support float and integers and you try to assign an integer). In this case an explicit typ conversion solves the problem.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM