1

我正在尝试boost::container::vector<int>使用 Cereal 序列化一个(我知道 boost 提供了一个类似于 Cereal 的序列化库,但是整个项目都使用 Cereal 并且它的一个角落恰好依赖于 boost 向量)。

我已经为 定义了模板化saveload函数boost::container::vector<int>,但 Cereal 失败并出现静态断言,说它找不到保存/加载函数对、序列化函数或 save_minimal/load_minimal 函数对。

这是一个展示这个问题的简单代码。为了比较,我还定义了一个模板结构 myStruct ,它采用与 a 相同类型的模板参数boost::container::vector,以检查相同的代码是否适用于我自己的类型。

#include <cereal/archives/binary.hpp>
#include <sstream>
#include <boost/container/vector.hpp>

namespace bc = boost::container;

template<typename T, typename V = void, typename W = void>
struct myStruct {};

template<typename A>
void save(A& ar, const myStruct<int>& v) {}

template<typename A>
void load(A& ar, myStruct<int>& v) {}

template<typename A>
void save(A& ar, const bc::vector<int>& v) {}

template<typename A>
void load(A& ar, bc::vector<int>& v) {}

int main()
{
    std::stringstream ss;
    {
        cereal::BinaryOutputArchive oarchive(ss);
        bc::vector<int> myData;
        //myStruct<int> myData;
        oarchive(myData); 
    }
    {
        cereal::BinaryInputArchive iarchive(ss); 
        bc::vector<int> myData;
        //myStruct<int> myData;
        iarchive(myData); 
    }
}

编辑:请注意,在包含任何谷物标题之前,我还尝试重新定义CEREAL_SERIALIZE_FUNCTION_NAME, CEREAL_LOAD_FUNCTION_NAME和,因为我虽然和方法可能与 boost 提供的函数发生冲突,但即使使用重命名的函数也不起作用。CEREAL_SAVE_FUNCTION_NAMEsaveload

4

1 回答 1

0

您必须在or中定义save/load函数。namespace cerealnamespace boost::container

于 2021-06-03T17:15:37.417 回答