%module template_forward %{ namespace foo { template class bar { }; } %} namespace foo { template class bar; }; %inline %{ namespace foo { double test1(const bar &x) { return 0; } bar test2() { return bar(); } } %} %inline { // Forward declarations template class LinearOpBase; template class VectorBase; } %inline { // Class Describable class Describable { public: void describe() {} }; // Class LinearOpBase template class LinearOpBase : virtual public Describable { public: }; // end class LinearOpBase // Class VectorBase template class VectorBase : virtual public LinearOpBase { public: using LinearOpBase::describe; }; // end class VectorBase } %template (LinearOpBase_double) LinearOpBase; %template (VectorBase_double) VectorBase; %template (LinearOpBase_int) LinearOpBase; %template (VectorBase_int) VectorBase;