[英]Does boost::variant support 64bit integers?
I tried to use boost::variant combined with a 64 bit integer. 我尝试将boost :: variant与64位整数结合使用。 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. 我正在使用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. @hvd仍然发现了故障。 I must explicitly name the type - but only if it's an int64. 我必须明确命名该类型-但前提是它是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. 给出一个简短的答案:boost :: variant确实支持64位整数。
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). 但是,如果分配给boost :: variant的值不明确,则可能导致编译器错误(例如,boost :: variant确实支持浮点数和整数,并且您尝试分配整数)。 In this case an explicit typ conversion solves the problem. 在这种情况下,显式类型转换可以解决该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.