Boost logo

Boost Users :

From: Christoph (christoph.duelli_at_[hidden])
Date: 2007-11-26 15:56:22


I have written code to serialize a class hierarchy (with lots of
shared_ptrs, strings, vectors etc.). This compiles (and works) on gcc 4.1.2
(OpenSuse 10.3).

When trying to compile it on an older machine (gcc 3.3.3) I am getting lots
of compiler errors which seem to boil down to the issue the the
(de)serialization code fails to instantiate some abstract class in the
hierarchy.

I understand that instantiating these classes has to fail, what I do not
understand is why the same code compiles with gcc 4.1.2...
any ideas?

What I did was:
I have defined the following typedefs/macros
typedef boost::archive::binary_iarchive InArchive;
typedef boost::archive::binary_oarchive OutArchive;

#define DECLARE_AS_SERIALIZABLE \
friend class boost::serialization::access; \
void serialize(InArchive & ar, const unsigned int file_version); \
void serialize(OutArchive & ar, const unsigned int file_version)

and have augmented each and every class in the hierarchy with the line
DECLARE_AS_SERIALIZABLE /* inside the class */
BOOST_SERIALIZATION_SHARED_PTR(Node); /* after the class decl. */

in the .cpp file I have
BOOST_CLASS_EXPORT_GUID(mepl::Node, "Node") // for each class
and the implementation of the serialize methods
void Node::serialize(InArchive & ar, const unsigned int /* file_version */){
   ar & BOOST_SERIALIZATION_NVP(m_sFileName)
      //& BOOST_SERIALIZATION_NVP(m_sSource)
      // & BOOST_SERIALIZATION_NVP(m_parentNode)
      & BOOST_SERIALIZATION_NVP(m_iStartLine)
      & BOOST_SERIALIZATION_NVP(m_iStartColumn)
      & BOOST_SERIALIZATION_NVP(m_iEndLine)
      & BOOST_SERIALIZATION_NVP(m_iEndColumn);
}
void ExprNode::serialize(InArchive & ar, const unsigned int /* file_version
*/){
   ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(Node);
   bool bConst;
   ar & BOOST_SERIALIZATION_NVP(m_type)
      & BOOST_SERIALIZATION_NVP(bConst)
      & BOOST_SERIALIZATION_NVP(m_wert);
   m_bIsConst=bConst;
}

etc.

As I've said, this works beautifully with gcc 4.1.2.
Have I made a mistake here? Or is the older compiler not suppored in by
Boost.Serialization?

Small part of the compiler's output
//melos/prog/boost/include/boost-1_34_1/boost/serialization/access.hpp: In
   static member function `static void
   boost::serialization::access::construct(Archive&, T*) [with Archive =
   boost::archive::binary_iarchive, T = mepl::Node]':
//melos/prog/boost/include/boost-1_34_1/boost/serialization/serialization.hpp:105:
instantiated from `void boost::serialization::load_construct_data(Archive&,
T*, unsigned int) [with Archive = boost::archive::binary_iarchive, T =
mepl::Node]'
//melos/prog/boost/include/boost-1_34_1/boost/serialization/serialization.hpp:170:
instantiated from `void
boost::serialization::load_construct_data_adl(Archive&, T*, unsigned int)
[with Archive = boost::archive::binary_iarchive, T = mepl::Node]'
//melos/prog/boost/include/boost-1_34_1/boost/archive/detail/iserializer.hpp:308:
instantiated from `void boost::archive::detail::pointer_iserializer<T,
Archive>::load_object_ptr(boost::archive::detail::basic_iarchive&, void*&,
unsigned int) const [with T = mepl::Node, Archive =
boost::archive::binary_iarchive]'
/usr/include/g++/bits/locale_facets.h:214: instantiated from here
//melos/prog/boost/include/boost-1_34_1/boost/serialization/access.hpp:123:
error: cannot
   allocate an object of type `mepl::Node'
//melos/prog/boost/include/boost-1_34_1/boost/serialization/access.hpp:123:
error:
    because the following virtual functions are abstract:
node.hpp:59: error: virtual void mepl::Node::streamout(std::ostream&)
const

Thank you, and best regards
Christoph


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net