2015-10-26 6 views
4

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


Я пишу Serialization функцию для 3D-моделей в моем двигателе с использованием зерновых, что доказывает быть действительно эффективными и простым в использовании. До сих пор все работало отлично, когда я тестировал (де-) сериализацию простой 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

'filepath' является' std :: string'? Измените свой вопрос, чтобы указать тип. –

+0

[using namespace is evil] (https://isocpp.org/wiki/faq/coding-standards#using-namespace-std) –

ответ

2

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

map<string, unique_ptr<MeshDescription> >

Чтобы получить std::unique_ptr я обычно #include <memory>

От cereal documentation:

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

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

P.S. Когда ваш объект владеет ресурсами (например, динамически распределенными MeshDescription), он всегда делегирует управление ресурсами (выделение, освобождение, копирование и т. Д.) В отдельный класс (интеллектуальный указатель, сбор, оболочка и т. Д.). См. rule of 0.

+0

Возможно, это сработает, но мне все еще интересно, ПОЧЕМУ мой код не компилируется. Как я уже сказал, я использовал что-то подобное (практически одно и то же, но с другой структурой) работает абсолютно нормально, не жалуясь. Я хочу использовать реальное решение или понять, что происходит, и не использовать какое-либо обходное решение для странного поведения. – LukeG

+0

P.S. Я уже это делаю. Код, который я опубликовал, находится в классе RessourceManager. – LukeG

+0

Хорошо, я глуп. Я, хотя ошибка была внутри функции loadFile, хотя на самом деле это был факт, что я использую карту, состоящую из указателя как значения. Спасибо за вашу помощь. – LukeG

 Смежные вопросы

  • Нет связанных вопросов^_^