+/** Default constructor */
+template <class T, template <class> class CP>
+structure<T, CP>::structure() : inherited(get_tinfo()) { }
+
+/** Construct object from archive_node. */
+template <class T, template <class> class CP>
+structure<T, CP>::structure(const archive_node &n, lst &sym_lst) : inherited(n, sym_lst) {}
+
+/** Unarchive the object. */
+template <class T, template <class> class CP>
+ex structure<T, CP>::unarchive(const archive_node &n, lst &sym_lst)
+{
+ return (new structure(n, sym_lst))->setflag(status_flags::dynallocated);
+}
+
+/** Archive the object. */
+template <class T, template <class> class CP>
+void structure<T, CP>::archive(archive_node &n) const
+{
+ inherited::archive(n);
+}
+
+/** Compare two structures of the same type. */
+template <class T, template <class> class CP>
+int structure<T, CP>::compare_same_type(const basic & other) const
+{
+ GINAC_ASSERT(is_a<structure>(other));
+ const structure & o = static_cast<const structure &>(other);
+
+ return struct_compare(&obj, &o.obj);
+}
+
+template <class T, template <class> class CP>
+registered_class_info structure<T, CP>::reg_info = registered_class_info(registered_class_options(structure::get_class_name(), "basic", next_structure_tinfo_key++, &structure::unarchive));
+