
The real question here is:
What else is supposed to be in this file? Do I need to put in the code that loads and saves archives in this file?
And here is the answer. I expect that BOOST_CLASS_EXPORT will be specified in the same header file as the class declaration to which it corresponds. That is, BOOST_CLASS_EXPORT(T) is a "trait" of the class. This trait is the "external name" used to identify the class and is needed when serializing polymorphic types through a base class pointer. I expect that one's program will generally look like: #include <boost/archive/xml_oarchive.hpp> .... #include "my_class.hpp" // which has BOOST_CLASS_EXPORT inside In boost 1.35 (aka HEAD) these headers can be in any order. In 1.34 and earlier, the archive headers have to go before any headers which contain BOOST_CLASS_EXPORT This will instantiate any code required to serialize types specified by BOOST_CLASS_EXPORT for each archive included. (note that the code is instantiated regardless of whether or not it is actually invoked.) If no archive headers are included - no code should be instantiated. This will permit BOOST_CLASS_EXPORT to be a permanent part of the my_class declaration. (Right now this provokes an error message. I'll rectify that.) I hope this clarifies things. Robert Ramey Deane Yang wrote:
Robert Ramey wrote:
In fact, my implementation file contains *only* BOOST_CLASS_EXPORT statements.
Then no code will be instantiated - as you have indeed found.
Code like this seems to compile only if I also include archive headers like: #include <boost/archive/xml_oarchive.hpp> #include <boost/archive/xml_iarchive.hpp>
correct.
If these directives are omitted, then my code does not compile.
Hmmm - the required code to export class x to archive xml_?archive.hpp will not be instantiated. I would expect that to show up as a missing symbol during linking.
No, I get something like:
..\..\..\..\vendor\boost\boost/serialization/type_info_implementation.hpp(48)
error C2027: use of undefined type 'boost::serialization::extended_type_info_impl<T>' with [ T=Input::Bond ] ..\..\..\..\vendor\boost\boost/serialization/export.hpp(75) : see reference to class template instantiation 'boost::serialization::type_info_implementation<T>' being compiled with [ T=Input::Bond ]
OK - I believe that is misleading. I'm changing my local copy to #include <boost/serialization/extended_type_info.hpp> so that this error doesn't appear.