0

Boostを使用して、デフォルト以外のコンストラクターを使用して派生ポインタークラスをシリアル化しようとしています。

コンパイル中にエラーが発生します:

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のどこかに、派生クラスを保存してロードしたいと思います。そのため、最初に述べたコンパイルエラーにより、先に進むことができません。

私が欠けているもののヒントはありますか?

4

1 に答える 1

2

としてタグ付けされたDerivedinmemoryを構築しようとしているため、コンパイラが文句を言っていると思います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

ブーストドキュメントにも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);
}
于 2013-03-18T17:13:04.820 に答える