Каша не поддерживает сырые указатели

Редактировать: Название вопроса было основано на глубоком неправильном понимании ошибки компилятора, которую я получил. Я (глупо) предполагал, что ошибка заключалась в том, что я пытался десериализовать объект, который я объявил внутри функции. Это было совершенно неправильно. Я не делал достаточно усилий для отладки, иначе я мог бы узнать, что не так. Таким образом, название было довольно ошибочным, и я изменил его. Спасибо Андрею Беньковскому за помощь.


Я пишу функции сериализации для 3D-моделей в своем движке, используя зерновые, что оказывается действительно эффективным и простым в использовании.
До сих пор все работало отлично, когда я тестировал (де) сериализацию простой сетки.
Но сейчас я пытаюсь десериализовать другой класс, но столкнулся с проблемой, которой у меня нет.

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 не поддерживает сериализацию сырых указателей — используйте умный указатель
Хотя это не указатель. В другой части кода нечто подобное работает просто отлично. Я был бы рад, если бы кто-нибудь мог помочь мне решить это.

4

Решение

Я никогда не использовал Cereal, но, похоже, он ожидает, что вы будете использовать что-то вроде этого:

map<string, unique_ptr<MeshDescription> >

Получить станд :: unique_ptr я обычно #include <memory>

От зерновая документация:

cereal поддерживает сериализацию умных указателей, но не тупых указателей (то есть необработанных указателей, таких как int *) или ссылки. Поддержку указателя можно найти, включив <cereal/types/memory.hpp>,

Может быть, это означает, что вы должны включить их заголовок вместо стандартного.

Постскриптум Когда ваш объект владеет ресурсами (например, динамически распределяется MeshDescriptionвсегда делегировать управление ресурсами (выделение, освобождение, копирование и т. д.) в отдельный класс (интеллектуальный указатель, сборщик, оболочка и т. д.) Увидеть правило 0.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]