Serialization: docs regarding abstract base class

I quote the Boost serialization docs: When serializing an object through a pointer to its base class and that base class is abstract (i.e. has at least one virtual function assigned a value of 0), A compile error will be emitted. This is addressable in one over several ways: * remove the =0 in the base classes so that the base class is no longer abstract. * implement is_abstract for your compiler. (code written according to the C++ standard is included with this library. But it is known to fail on several compilers. * use the macro BOOST_IS_ABSTRACT(my_class) to indicate that the class is an abstract base class. This will cause the compiler to avoid generating code that causes this error. I still do not understand part 2 of this advice, Robert. Could you explain? Jean-Noël Ps: as already mentioned, part 3 does not change anything for me, and I'd like to avoid the solution of part 1 since I do want the base class to be abstract.

On Mar 1, 2006, at 00:59, RIVASSEAU Jean Noel wrote:
I quote the Boost serialization docs:
When serializing an object through a pointer to its base class and that base class is abstract (i.e. has at least one virtual function assigned a value of 0), A compile error will be emitted. This is addressable in one over several ways:
* remove the =0 in the base classes so that the base class is no longer abstract. * implement is_abstract for your compiler. (code written according to the C++ standard is included with this library. But it is known to fail on several compilers. * use the macro BOOST_IS_ABSTRACT(my_class) to indicate that the class is an abstract base class. This will cause the compiler to avoid generating code that causes this error.
I still do not understand part 2 of this advice, Robert. Could you explain?
The BOOST_IS_ABSTRACT macro expands into a specialization of the is_abstract template (in is_abstract.hpp) for the specified class, and returns mpl::bool<true> for the specified type. I think part 2 is a suggestion that a more general template may be written on a per-platform basis that properly returns mpl::bool<true> when the class is derived from an abstract base class. It's left as an exercise for the reader :) I'm not up to it right now myself...
Ps: as already mentioned, part 3 does not change anything for me, and I'd like to avoid the solution of part 1 since I do want the base class to be abstract.
I've found that it doesn't matter if you use BOOST_IS_ABSTRACT on the actual abstract base class, but you MUST (currently - 1.33.0) on the DERIVED class to get it to work "correctly". I'd consider this a bug, but I'm not sure of the specification and haven't had time to research it.

Note that the tutorial programs do use BOOST_IS_ABSTRACT so I've always
assumed that
it functions as advertised. Since the demo doesn't use BOOST_EXPORT, I
suspect that
that there is some sort of problem related to instantiation of abstract base
class code
for exported types. I'lll look into it.
Robert Ramey
"RIVASSEAU Jean Noel"
participants (3)
-
Hugh Hoover
-
RIVASSEAU Jean Noel
-
Robert Ramey