namespace featurelib
{
typedef vector<float*> HOG_List;
}
void saveFeaturesFile(vector<featurelib::HOG_List> &features, string filename){
ofstream out(filename.c_str());
stringstream ss;
boost::archive::binary_oarchive oa(ss);
oa << features;
out << ss.str();
out.close();
}
这是我的代码段,我正在尝试使用Boost Serialization将vector<featurelib::HOG_List>
保存到二进制文件中。
但这会导致错误:
错误C4308:负整数常量转换为无符号类型
但是当我删除指针,即
typedef vector<float> HOG_List;
代码编译并正常工作。 但是我需要找到一种方法,使用Boost
将typedef vector<float*> HOG_List;
的向量保存到二进制文件中
答案 0 :(得分:1)
为什么你会有float*
的载体?
除此之外,由于对象跟踪,指针对序列化是特殊的:http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/special.html#objecttracking和潜在的多态/别名。
因为float
是原始类型,所以多态性不是一个问题。但是,出于同样的原因,对象跟踪会很难处理并且已被禁用:
默认情况下,永远不会跟踪Implementation Level类序列化特征指定的基元数据类型。如果希望通过指针(例如用作引用计数的
long
)跟踪共享原始对象,则应将其包装在类/结构中,以使其成为可识别的类型。更改long的实现级别的替代方案将影响整个程序中序列化的所有longs - 可能不是人们想要的那样。
反过来,这意味着序列化库不知道如何处理float*
我建议您使用ptr_vector或者真的想到为什么需要这些指针。
指针是什么意思?用捕获语义的抽象替换它们。例如。如果float*
是/ true /数组中第一个元素的地址,如float[32]
,则将HOG_List
重新定义为例如。
typedef std::vector<std::vector<float> > HOG_List;
如果您 以满足&#34;无主&#34;数组,你可以用像GLS&#39; d array_view
struct float_array_view {
float* base;
size_t n;
};
typedef std::vector<float_array_view> HOG_List;
注意在这种情况下,将必须定义一种反序列化方法(使用boost::serialization::make_array序列化)。因为图书馆无法知道如何分配base*
。
另见:
此处有更多可能相关的帖子:https://stackoverflow.com/search?q=user%3A85371+boost+make_array