0

Я пытаюсь сериализовать производный класс указателя с конструктором не по умолчанию с помощью boost.load_construct_data в boost: проблемы с размещением new

Во время компиляции я получаю сообщение об ошибке:

Derived.h: In function ‘void boost::serialization::load_construct_data(Archive&, const A::Derived*, unsigned int)’: 

in Derived.h: error: no matching function for call to ‘operator new(long unsigned int, const A::Derived*&) 

Я включал <new> к Derived.h, но у меня есть ощущение, что я забыл что-то сделать. Вот приблизительная оценка кода, который у меня есть.

У меня есть базовый класс с виртуальными функциями и не-конструктор по умолчанию (в Base.h)

#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/export.hpp> 
namespace A{ 

    class Base 

    { 

    public: 

      int getID(){return ID}; 

      //non default constructor 
      Base(param1, param2, param3):ID(param1+param2), BaseFlag(param3) {}; 
      Base(param1, param3):ID(param1), BaseFlag(param3) {}; 

      //some virtual functions 
      virtual void Foo1(); 
      virtual void Foo2(); 
      ... 

    private: 

      int ID; 
      bool BaseFlag; 
      ... 

      //void serialize function 
      friend class boost::serialization::access; 
      template<class Archive> 
      void serialize(Archive & ar, const unsigned int version) 
      { 

      } 

    }; 

} 
//end of namespace A 
//implementation is in another file - exporting key 
BOOST_CLASS_EXPORT_KEY(Base) 

Существует производный класс (в Derived.h)

#include <boost/serialization/base_object.hpp> 
#include <boost/archive/text_oarchive.hpp> 
#include <boost/archive/text_iarchive.hpp> 
#include <boost/serialization/export.hpp> 
#include <new> 
#include "Base.h" 

namespace A{ 

    //derived class 
    class Derived: public Base 
    { 
    public: 
     //non default constructor 
     Derived(param3):Base(param3, false); 
     ... 
    private: 
     friend class boost::serialization::access; 
     template<class Archive> 

     // serialize base class information 
     void serialize(Archive & ar, const unsigned int version) 
     { 
      ar & boost::serialization::base_object<Base>(*this); 
     } 

     //prototype of save_construct_data for non-default constructor 
     template<class Archive> friend 
      void boost::serialization::save_construct_data(Archive & ar, 
         const Derived * t, const unsigned int file_version); 

     //prototype of load_construct_data for non-default constructor 
     template<class Archive> friend 
      void boost::serialization::load_construct_data(Archive & ar, 
         const Derived * t, const unsigned int file_version); 
    }; 
} 
//end of namespace A 

//export derived class 
BOOST_CLASS_EXPORT_KEY(Derived) 

//describe save_construct_data 
namespace boost { 
    namespace serialization { 
     template<class Archive> 
     inline void save_construct_data(Archive & ar, const A::Derived * t, const unsigned int file_version) 
     { 
      // save data required to construct instance 
      ar << t->ID; 

     } 

     template<class Archive> 
     inline void load_construct_data(Archive & ar, const A::Derived * t, const unsigned int file_version) 
     { 
      int ID; 
      // load data required to construct instance 
      ar >> ID; 
      ::new(t) A::Derived(ID); 

     } 


    } 
} 

И где-то в main.cpp Я хочу сохранить и загрузить производный класс. Таким образом, ошибка компиляции, о которой я упоминал в начале, не позволяет мне продолжить.

Какие-либо намеки, что мне не хватает?

ответ

2

Я считаю, что компилятор жалуется, потому что вы пытаетесь построить производное в памяти с тегами const. В этой декларации:

template<class Archive> friend 
    void boost::serialization::load_construct_data(Archive & ar, 
       const Derived * t, const unsigned int file_version); 

Я думаю, что вы хотите Derived *t, не const Derived *t.

boost docs также не имеют const в подписи функции:

template<class Archive> 
inline void load_construct_data(
    Archive & ar, my_class * t, const unsigned int file_version 
){ 
    // retrieve data from archive required to construct new instance 
    int attribute; 
    ar >> attribute; 
    // invoke inplace constructor to initialize instance of my_class 
    ::new(t)my_class(attribute); 
} 
+0

Это было его. Thanx –

+0

Если вы довольны ответом на свой вопрос, вы можете его принять. Это помогает будущим зрителям и дает ответчикам стимул. – rhashimoto