Hi All,
I am getting compiler errors using mingw 3.4.5 on the code below:
error: `BaseClass::BaseClass(const std::string&)' is protected
I tried to declare as friend the load_construct_data() override in BaseClass
but gave me the following error:
error: call of overloaded load_constuct_data(..) is ambiguous.
What am I doing wrong?
TIA,
Gvv
...
#include
#include
#include
#include
#include
#include
template <class T>
void Serialize(const T& t, std::string& OutData)
{
std::ostringstream ArchiveStream;
boost::archive::text_oarchive Archive(ArchiveStream);
Archive << t;
OutData = ArchiveStream.str();
}
template <class T>
void Deserialize(T& t, const std::string& InData)
{
std::istringstream ArchiveStream(InData);
boost::archive::text_iarchive Archive(ArchiveStream);
Archive >> t;
}
class BaseClass : private boost::noncopyable
{
public:
virtual ~BaseClass() {}
const std::string& GetName() const
{
return Name;
}
protected:
BaseClass(const std::string& name) : Name(name) {}
private:
std::string Name;
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & Name;
}
friend class boost::serialization::access;
};
typedef boost::shared_ptr<BaseClass> BaseClassPtr;
class DerivedClass : public BaseClass
{
public:
DerivedClass(const std::string& name) : BaseClass(name) {}
private:
template<class Archive>
void serialize(Archive& ar, const unsigned int version)
{
ar & boost::serialization::base_object<BaseClass>(*this);
}
friend class boost::serialization::access;
};
BOOST_CLASS_EXPORT(DerivedClass)
namespace boost
{
namespace serialization
{
template<class Archive>
inline void save_construct_data(Archive& ar, const BaseClass* t, const
unsigned int version)
{
ar << t->GetName();
}
template<class Archive>
inline void load_construct_data(Archive& ar, BaseClass* t, const
unsigned int version)
{
std::string name;
ar >> name;
::new(t)BaseClass(name);
}
template<class Archive>
inline void save_construct_data(Archive& ar, const DerivedClass* t,
const unsigned int version)
{
ar << t->GetName();
}
template<class Archive>
inline void load_construct_data(Archive& ar, DerivedClass* t, const
unsigned int version)
{
std::string name;
ar >> name;
::new(t)DerivedClass(name);
}
}
}
int main()
{
BaseClassPtr b(new DerivedClass("My name is gvv"));
std::string data;
std::cout << "Serialize" << std::endl;
Serialize(b,data);
std::cout << data << std::endl;
b.reset();
std::cout << "Deserialize" << std::endl;
Deserialize(b,data);
std::cout << b->GetName() << std::endl;
return 0;
}