【问题标题】:Vector of Pointers C++ Boost Serialization Error指针向量 C++ Boost 序列化错误
【发布时间】:2016-04-21 05:49:21
【问题描述】:
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();
    }

这是我的代码 sn-p,我正在尝试使用 Boost 序列化将 vector&lt;featurelib::HOG_List&gt; 保存到二进制文件中。 但这会导致错误:

错误 C4308:负整数常量转换为无符号类型

但是当我删除指针时,即

typedef vector<float> HOG_List; 

代码编译并运行良好。 但是我需要找到一种方法来使用 Boost 将typedef vector&lt;float*&gt; HOG_List; 的向量保存到二进制文件中

【问题讨论】:

    标签: c++ serialization boost vector


    【解决方案1】:

    为什么会有float* 的向量?

    除此之外,由于对象跟踪,指针对于序列化是特殊的:http://www.boost.org/doc/libs/1_60_0/libs/serialization/doc/special.html#objecttracking 和潜在的多态性/别名。

    因为float 是一个原始类型多态性,所以这里不用担心。但是,出于同样的原因,对象跟踪会很笨拙并且已被禁用:

    默认情况下,由Implementation Level 类序列化特征指定的原始数据类型永远不会被跟踪。如果希望通过指针跟踪共享的原始对象(例如,long 用作引用计数),则应将其包装在类/结构中,使其成为可识别的类型。更改 long 的实现级别的替代方法会影响整个程序中序列化的所有 long - 可能不是人们想要的。

    这又意味着序列化库不知道如何处理float*


    我建议您使用 ptr_vector 或认真思考为什么需要指针。

    这些指针是什么意思?将它们替换为捕获语义的抽象。例如。如果float* 是/really/ 数组中第一个元素的地址,例如float[32],则将HOG_List 重新定义为例如

    typedef std::vector<std::vector<float> > HOG_List;
    

    如果您需要满足“无主”数组的需求,您可以使用 GLS 的 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

    【讨论】:

    • 添加了一些旧答案的链接,这些答案显示了如何在不同场景中序列化指针
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多