Редактировать: Название вопроса было основано на глубоком неправильном понимании ошибки компилятора, которую я получил. Я (глупо) предполагал, что ошибка заключалась в том, что я пытался десериализовать объект, который я объявил внутри функции. Это было совершенно неправильно. Я не делал достаточно усилий для отладки, иначе я мог бы узнать, что не так. Таким образом, название было довольно ошибочным, и я изменил его. Спасибо Андрею Беньковскому за помощь.
Я пишу функции сериализации для 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 не поддерживает сериализацию сырых указателей — используйте умный указатель
Хотя это не указатель. В другой части кода нечто подобное работает просто отлично. Я был бы рад, если бы кто-нибудь мог помочь мне решить это.
Я никогда не использовал Cereal, но, похоже, он ожидает, что вы будете использовать что-то вроде этого:
map<string, unique_ptr<MeshDescription> >
Получить станд :: unique_ptr я обычно #include <memory>
cereal поддерживает сериализацию умных указателей, но не тупых указателей (то есть необработанных указателей, таких как int *
) или ссылки. Поддержку указателя можно найти, включив <cereal/types/memory.hpp>
,
Может быть, это означает, что вы должны включить их заголовок вместо стандартного.
Постскриптум Когда ваш объект владеет ресурсами (например, динамически распределяется MeshDescription
всегда делегировать управление ресурсами (выделение, освобождение, копирование и т. д.) в отдельный класс (интеллектуальный указатель, сборщик, оболочка и т. д.) Увидеть правило 0.
Других решений пока нет …