我有一个模板化的基类:
template<typename T>
class A {
public:
T a;
template<class Archive>
void serialize(Archive & ar) {
ar(a);
}
};以及从它派生出来的模板类:
template<typename T>
class B : public A<T> {
public:
T b;
template<class Archive>
void serialize(Archive & ar) {
ar(cereal::base_class<A<T>>(this));
ar(b);
}
};它在另一个序列化类中使用:
template<typename T>
class C {
template<class Archive>
void serialize(Archive & ar)
{
ar(collection);
}
std::vector<std::shared_ptr<A<T>>> collection;
};此代码和使用它的代码被编译为静态库。
根据我对麦片文档的理解,我需要补充一下
CEREAL_REGISTER_TYPE(A<double>)
CEREAL_REGISTER_TYPE(A<float>)
CEREAL_REGISTER_TYPE(B<double>)
CEREAL_REGISTER_TYPE(B<float>)对于将要使用的每种类型,在每个类的头文件中
这是编译出来的。但运行时错误为
试图保存未注册的多态类型(B)。确保您的类型已在CEREAL_REGISTER_TYPE中注册,并且您正在使用的存档在调用CEREAL_REGISTER_TYPE之前已经包含(并在CEREAL_REGISTER_ARCHIVE中注册)。如果您的类型已经注册,并且仍然看到此错误,则可能需要使用CEREAL_REGISTER_DYNAMIC_INIT。
从文档中,我认为我需要在头文件中添加CEREAL_FORCE_DYNAMIC_INIT(libname),在CPP文件中添加CEREAL_REGISTER_DYNAMIC_INIT,但是没有cpp文件。或者一个合适的CPP文件来放置这个。
添加CEREAL_REGISTER_POLYMORPHIC_RELATION没有什么不同,因为B的序列化函数正在用cereal::base_class调用基calss A,有没有一种方法可以使用cereal::base_class来序列化模板类?
发布于 2016-10-20 17:44:21
问题归结为所包含的标题的顺序和它们被包含的位置,再加上少量的RTFM。
在基类标题中需要:
#include <cereal/types/polymorphic.hpp>
#include <cereal/archives/portable_binary.hpp>再加上我想要序列化的任何其他类型。
然后在子类中为每个受支持的类型添加CEREAL_REGISTER_TYPE。
正如文档中所指出的,关键是归档类型包含在之前,而不是 CEREAL_REGISTER_TYPE。它们不必与类声明位于同一个文件中。只需在注册类型之前包含标头。
https://stackoverflow.com/questions/40154922
复制相似问题