c – Cereal不支持原始指针

编辑:问题标题是基于对我得到的编译器错误的深刻误解.我(愚蠢地)假设错误是,我试图反序列化到我在函数内部声明的对象.这完全错了.我自己没有做足够的调试工作,或者我可以找出问题所在.因此标题非常具有误导性,我改变了它.感谢АндрейБеньковский提供帮助.

我正在使用谷物在我的引擎中为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不支持序列化原始指针 – 请使用智能指针
即使它不是指针.在代码的另一部分,类似的工作就好了.如果有人能帮我解决这个问题,我会很高兴的.

最佳答案 我从未使用过谷歌,但看起来它希望你使用这样的东西:

map< string,unique_ptr< MeshDescription> >

为了获得std::unique_ptr,我通常#include< memory>

cereal documentation开始:

谷歌支持序列化智能指针,但不支持哑指针(即原始指针,如int *)或引用.通过包括< cereal / types / memory.hpp>可以找到指针支持.

也许这意味着你必须包括他们的标题而不是标准.

附:当您的对象拥有资源(例如,动态分配的MeshDescription)时,始终将资源管理(分配,释放,复制等)委托给单独的类(智能指针,集合,包装器等).见rule of 0.

点赞