Classdesc will work with any syntactically correct C++ code, and
attempt to do the best it can. It ignores anything that is not a
struct/class definition, or an enum definition. Classdesc
does not preprocess the code presented to it -- if you depend on the
preprocessor in your class definitions, you must filter your code
through the preprocessor first,4 defining the macro
_CLASSDESC
to ensure pragmas are seen by the
Classdesc processor.
Unfortunately, overloaded member functions cannot be
resolved to a distinct member pointer, so are quietly ignored by
classdesc. This is not an issue with serialisation, of course, as all
member functions are ignored, but has implications for descriptors such as
TCL_obj
that export object functionality.
Raw pointers also cause problems in that there is no information at runtime about how many objects a pointer points to, or whether it is reasonable to extend the array with memory taken from the heap. Support for the various uses of pointers is discussed in §13.2.1.
Another issue that occurs in reference to types defined in the current namespace with template parameters occuring as part of a specialisation. For example:
namespace frozz { class Bar {}; template <> class Foo<Bar> {}; }In this case, the classdesc processor does not know which namespace Bar is defined in, (as its more forgetful than your average C++ compiler), so you will get a compile error that Bar is unknown. The workaround in this case is to full qualify type where necessary, ie replace the above code with
namespace frozz { class Bar {}; template <> class Foo<frozz::Bar> {}; }