%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; // Template forward class declarations mixing class and typename without always naming the templated parameter name %inline %{ template class TClass1; template class TClass2; template class TClass3; template class TClass4; template class TClass5; template class TClass6; template class TClass7; %}