我正在尝试使用Cereal来序列化一个boost::container::vector<int> (我知道boost提供了一个类似于Cereal的串行化库,但是整个项目都使用Cereal,而且只有一个角落碰巧依赖于一个boost向量)。
我已经为boost::container::vector<int>定义了模板化的save和load函数,但是boost::container::vector<int>失败了,静态断言说它找不到函数的保存/加载对、序列化函数或save_minimal/load_minimal函数对。
下面是一个简单的代码来说明这个问题。为了进行比较,我还定义了一个模板结构myStruct,它接受与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和CEREAL_SAVE_FUNCTION_NAME,因为我认为save和load方法可能与boost提供的函数冲突,但即使使用重命名的函数,它也不起作用。
发布于 2021-06-04 01:15:37
您必须在namespace cereal或namespace boost::container中定义save/load函数。
https://stackoverflow.com/questions/58429654
复制相似问题