boost::variant是否支持64位整数
Does boost::variant support 64bit integers?
我尝试使用boost::variant与64位整数相结合。不幸的是,它没有起作用。有办法解决这个问题吗?还是我的升级版太旧了?我用的是V1.45。
这个声明有效:
std::vector< boost::variant<int, float64_t> > vec2;
声明无效:
std::vector< boost::variant<long long int, float64_t> > vec2;
编辑
这是一个编译器错误:
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_0boostvariantdetailinitializer.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_0boostvariantdetailinitializer.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_0boostvariantvariant.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> ]
编辑
错误在未发布的代码中。@hvd已经找到了错误。我必须显式地命名类型-但只有当它是int64时。
没有错误:
std::vector <boost::variant <int, float64_t> > vec;
vec.push_back ( 22 );
编译错误:
std::vector <boost::variant <__int64, float64_t> > vec;
vec.push_back ( 22 );
没有错误:
std::vector <boost::variant <__int64, float64_t> > vec;
vec.push_back ( (__int64) 22 );
给一个简短的回答:boost::variant不支持64位整数。
但是如果赋给boost::variant的值是不明确的,这可能会导致编译器错误(例如boost::variant不支持浮点数和整数,而你试图赋值一个整数)。在这种情况下,显式类型转换解决了这个问题。
相关文章:
- 在 c++ 中输出 64 位整数
- 使用192/256位整数求和无符号64位整数向量的点积的最快方法
- 在 64 位整数内旋转(90°)位矩阵(最多 8x8 位)
- 如何通过COM接口将64位整数从C++发送到C#
- GMP-将64位整数存储在mpz_t/mpz_class中,并返回64位整数
- 将 64 位整数中的每个其他位与 32 位整数进行比较
- 按段比较 64 位整数
- 64 位整数和更早的 C++ 编译器
- 64 位整数到双精度冲突
- 我们是否需要担心 32 位或 64 位整数,或者我们只使用 'int'
- 读取 64 位整数二进制文件
- 将 n 位从 8 位数组复制到 64 位整数?
- 每个值64位整数的数字应转换为位等效的64位浮数
- 将设置位移动到 64 位整数的末尾
- C 中64位整数的奇怪行为
- 在C++中实现 CTR 加密模式时,CTR 加上 64 位整数
- 通过GNU扩展asm约束加载64位整数常量
- 读取 64 位整数文件
- 编译器警告(CodeBlocks/wxwidget):您的编译器似乎不支持64位整数,而是使用仿真类
- 如何从64位整数获得更高的20位