%module nested_template_base #ifdef SWIGOCAML %warnfilter(SWIGWARN_PARSE_KEYWORD) val; #endif %inline %{ template class OuterT { public: T outer(T t) { return t; } }; %} // The %template goes after OuterT and before OuterC as OuterC::InnerC's base is handled inside OuterC %template(OuterTInnerS) OuterT; #if !defined(SWIGCSHARP) && !defined(SWIGJAVA) %feature("flatnested") OuterC::InnerS; %feature("flatnested") OuterC::InnerC; #endif %inline %{ class OuterC { public: struct InnerS; class InnerC; }; struct OuterC::InnerS { int val; InnerS(int val = 0) : val(val) {} }; class OuterC::InnerC : public OuterT { public: OuterT& innerc() { return *this; } }; %}