That was it! I had previously made the substitution, but mistakenly included the '<', '>' and ':' anyway. Replacing the macro in Derived::serialize() with the expansion below solves the problem.I would be very suspicious ofBOOST_SERIALIZATION_BASE_OBJECT_NVP(AbstractTemplate<std::string>)since the "name" is taken from the argument. Look at this macro definition andexpand it by hand.