簡體   English   中英

指針向量C ++ Boost序列化錯誤

[英]Vector of Pointers C++ Boost Serialization Error

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; 

該代碼可以編譯並正常工作。 但是,我需要找到一種方法來保存typedef vector<float*> HOG_List; 使用Boost轉換為二進制文件

為什么會有一個float*向量?

除此之外,由於對象跟蹤,指針是序列化的特殊對象: http : //www.boost.org/doc/libs/1_60_0/libs/serialization/doc/special.html#objecttracking和潛在的多態性/別名。

因為float是原始類型的多態性,所以在這里不必擔心。 但是,出於相同的原因,對象跟蹤將變得笨拙並且已被禁用:

默認情況下,從不跟蹤由實現級別類序列化特征指定的原始數據類型。 如果希望通過指針跟蹤共享的原始對象(例如long用作引用計數的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM