矢量指针C ++ Boost序列化错误

时间:2016-01-15 15:25:26

标签: c++ serialization boost vector

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;的向量保存到二进制文件中

1 个答案:

答案 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