编辑:问题标题是基于对我得到的编译器错误的深刻误解。我(愚蠢地)假设错误是,我试图反序列化到我在函数内部声明的对象。这完全错了。我自己没有做足够的调试工作,或者我可以找出问题所在。因此标题非常具有误导性,我改变了它。感谢АндрейБеньковский提供帮助。
我正在使用谷物在我的引擎中为3D模型编写序列化功能,这被证明非常有效且易于使用。 到目前为止,当我测试(de-)序列化一个简单的Mesh时,一切都很顺利。 但是现在我正在尝试将另一个类反序列化,但遇到了一个我无法解决的问题。
void loadFile(std::string filepath)
{
DescriptionFile file;
{
ifstream stream = ifstream(filepath, std::ifstream::binary);
PortableBinaryInputArchive archive(stream);
archive(file);
stream.close();
}
}
这是我的班级,应该反序列化:
struct DescriptionFile
{
public:
DescriptionFile(){}
map<string, MeshDescription*> meshDescriptions;
map<string, ModelDescription*> modelDescriptions;
public:
template<class Archive>
void serialize(Archive & archive)
{
archive(meshDescriptions, modelDescriptions);
}
};
它给了我编译器错误: Cereal不支持序列化原始指针 - 请使用智能指针 即使它不是指针。在代码的另一部分,类似的工作就好了。如果有人能帮我解决这个问题,我会很高兴。
答案 0 :(得分:2)
我从未使用过谷歌,但看起来它希望你使用这样的东西:
map<string, unique_ptr<MeshDescription> >
获取std::unique_ptr我通常#include <memory>
谷物支持序列化智能指针,但不支持哑指针(即原始指针,如int *
)或引用。可以通过包含<cereal/types/memory.hpp>
来找到指针支持。
可能意味着你必须包括他们的标题而不是标准。
P.S。当您的对象拥有资源(例如,动态分配MeshDescription
)时,始终将资源管理(分配,释放,复制等)委托给单独的类(智能指针,集合,包装等)。请参阅rule of 0。