C++ 指针向量C++;Boost序列化错误 命名空间特性库 { typedef向量HOG_列表; } void savefeatures文件(矢量和特征,字符串文件名){ 流输出(filename.c_str()); 细流ss; boost::archive::binary_oarchive oa(ss); oa

C++ 指针向量C++;Boost序列化错误 命名空间特性库 { typedef向量HOG_列表; } void savefeatures文件(矢量和特征,字符串文件名){ 流输出(filename.c_str()); 细流ss; boost::archive::binary_oarchive oa(ss); oa,c++,serialization,boost,vector,C++,Serialization,Boost,Vector,为什么你会有一个向量float* 此外,由于对象跟踪和潜在的多态性/别名,指针对于序列化是特殊的 因为float是一种基本类型,所以这里不需要考虑多态性。但是,出于同样的原因,对象跟踪会变得笨拙,并且已被禁用: 默认情况下,从不跟踪由类序列化特征指定的基本体数据类型。如果希望通过指针跟踪共享基本体对象(例如用作引用计数的long),应将其包装在类/结构中,使其成为可识别的类型。更改long的实现级别的替代方案将影响整个程序中序列化的所有long-可能不是我们所希望的 这反过来意味着序列化库不知道

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

此外,由于对象跟踪和潜在的多态性/别名,指针对于序列化是特殊的

因为
float
是一种基本类型,所以这里不需要考虑多态性。但是,出于同样的原因,对象跟踪会变得笨拙,并且已被禁用:

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

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


我建议你使用一个ptr_向量,或者想想你为什么需要指针

指针的意思是什么?用一个能够捕捉语义的抽象来替换它们。例如,如果
float*
是数组中第一个元素的地址,比如
float[32]
,那么将
HOG_列表重新定义为

typedef vector<float> HOG_List; 
注意在这种情况下,您必须定义一种反序列化方法(使用序列化)。因为库无法知道如何分配
基*

另见:

  • (这执行手动工作以分配反序列化)

这里有更多可能相关的帖子:

添加了一些旧答案的链接,展示了如何在不同场景中序列化指针
typedef vector<float> HOG_List; 
typedef std::vector<std::vector<float> > HOG_List;
struct float_array_view {
     float* base;
     size_t n;
};

typedef std::vector<float_array_view> HOG_List;