Сериализация Повышения C++, Сериализирующая шаблонные производные классы

я хотел бы сериализировать класс с атрибутом как список указателей на универсальном классе

Это - родительский класс, из которого происходит универсальный класс:

class Base{

    public :

        friend class boost::serialization::access;

        virtual ~Base(){}

        template
        void serialize(Archive & ar, const unsigned int version)
        {
        }

        virtual string Getid() = 0 ;

};

Универсальный класс:

template
class GenericBase : public Base
{
    public:

        friend class boost::serialization::access;

        GenericBase(string id){}
        ~GenericBase(){}

        string id;

        vector data

        template
        void serialize(Archive & ar, const unsigned int version)
        {
            ar & boost::serialization::base_object(*this);
            ar & BOOST_SERIALIZATION_NVP( id);
            ar & BOOST_SERIALIZATION_NVP( data);

        }

        string Getid() { return id; }

};

Класс я хочу сериализировать

class Use
{
    public:

        friend class boost::serialization::access;

        int Id;

        map BaseDatas;

        Use();
        ~Use();

};

Так, после чтения документа сериализации повышения (http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#derivedpointers) я попробовал это в коде сериализации:

main(){

   Use u = Use();

   std::ofstream ofs(filename, ios::binary);

   // save data to archive

   boost::archive::binary_oarchive oa(ofs);

   oa.template register_type >();
   oa.template register_type >();
   oa.template register_type >();

   oa<

Я получил сообщение,

ошибка: 'шаблон' (как disambiguator) только позволяется в шаблонах

, таким образом, я заменил

oa.template register_type> ();

OA register_type ();

это работало, и я смог сохранить в тексте и в двоичном файле (я проверил данные),

для загрузки теперь, я просто использовал эти строки:

main(){

    Use u;

    std::ifstream ifs(filename, ios::binary);

    // load data

    ia.register_type >();

    boost::archive::binary_iarchive ia(ifs);

    ia>>u;

}

это бросило меня ошибка:

ошибка: никакая функция соответствия для вызова к 'GenericBase:: GenericBase ()'

кто-то сказал мне, что я должен был переопределить 2 метода, сохраняют и загружаются как в этом демонстрационном http://www.boost.org/doc/libs/1_43_0/libs/serialization/doc/serialization.html#constructors

namespace boost { namespace serialization {
template
inline void save_construct_data(
    Archive & ar, const my_class * t, const unsigned int file_version)
    {
        // save data required to construct instance
        ar << t->m_attribute;
    }

template
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);
    }
}} // namespace ...

но где я должен определить их? В объявлении класса Использования? И как я имею дело с участником

map BaseDatas;

?

спасибо за Вашу справку ;)

5
задан user408535 2 August 2010 в 10:47
поделиться