指针的向量C++提升序列化错误

Vector of Pointers C++ Boost Serialization Error

本文关键字:升序 序列化 错误 C++ 向量 指针      更新时间:2023-10-16
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 序列化将vector<featurelib::HOG_List>保存到二进制文件中。但这会导致错误:

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

但是当我删除指针时,

typedef vector<float> HOG_List; 

代码编译并工作正常。但是我需要找到一种方法来使用 Boost 将typedef vector<float*> HOG_List;向量保存到二进制文件中

为什么你会有一个float*的向量?

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

因为float是基元类型的多态性在这里不是一个问题。但是,出于同样的原因,对象跟踪将变得笨拙,并且已被禁用:

默认情况下,从不跟踪由实现级别类序列化特征指定的基元数据类型。如果需要通过指针(例如用作引用计数的long)跟踪共享基元对象,则应将其包装在类/结构中,以便它是可识别的类型。更改 long 的实现级别的替代方案将影响整个程序中序列化的所有 longs - 可能不是人们想要的。

反过来,这意味着序列化库不知道如何处理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*

另请参阅:

  • 使用模板类提升序列化
  • 无法使C++提升指针序列化正常工作(这将完成为反序列化分配的手动工作)
  • 提升二进制序列化 - 固定长度错误的双数组

这里有更多可能相关的帖子:https://stackoverflow.com/search?q=user%3A85371+boost+make_array