有抽象I1
和派生C1
。如何使用boost序列化與shared_ptr成員的對象
有摘要I2
和派生C2
。
I1
有shared_ptr<I2>
。我怎樣才能使他們序列化使用boost serializaton?我試圖做到這一點,但我的應用程序得到例外。
#include <sstream>
#include <boost/shared_ptr.hpp>
#include <boost/archive/binary_oarchive.hpp>
#include <boost/archive/binary_iarchive.hpp>
#include <boost/serialization/shared_ptr.hpp>
struct I1
{
I1() {}
virtual ~I1() = 0 {}
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
}
};
struct C1 : I1
{
virtual ~C1() {}
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & boost::serialization::base_object<I1>(*this);
}
};
struct I2
{
virtual ~I2() = 0 {}
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & p;
}
boost::shared_ptr<I1> p;
};
struct C2 : I2
{
C2() { p = boost::shared_ptr<I1>(new C1); }
virtual ~C2() { }
template<class Archive>
void serialize(Archive &ar, const unsigned int version)
{
ar & boost::serialization::base_object<I2>(*this);
}
};
int main()
{
C2 c2;
std::string s;
std::stringstream ss(s);
boost::archive::binary_oarchive oa(ss);
oa.register_type<I1>();
oa.register_type<C1>();
oa.register_type<I2>();
oa.register_type<C2>();
oa << c2;
boost::archive::binary_iarchive ia(ss);
//ia.register_type<I1>(); // cannot instantiate abstract class
ia.register_type<C1>();
//ia.register_type<I2>(); // cannot instantiate abstract class
ia.register_type<C2>();
ia >> c2;
}
你能告訴我們哪個編譯器接受'= 0 {}'語法嗎?我知道它存在,但我不知道接受此輸入的編譯器 – sehe 2014-11-25 12:17:48
我使用MSVC編譯器 – Ufx 2014-11-26 18:33:17
有趣的是,您的代碼在Linux上的gcc 4.8.1上運行正常(除了'= 0 {}'語法)。 – 2014-11-27 11:45:29