%module template_nested // Test nested templates - that is template classes and template methods within a class. %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) ns::OuterClass::Inner1; %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) ns::OuterClass::Inner2; %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) ns::OuterTemplate::NestedInnerTemplate1; %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) ns::OuterTemplate::NestedInnerTemplate2; %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) ns::OuterTemplate::NestedInnerTemplate3; %warnfilter(SWIGWARN_PARSE_NAMED_NESTED_CLASS) ns::OuterTemplate::NestedStruct; namespace ns { template struct ForwardTemplate; } %{ namespace ns { template struct ForwardTemplate { void tmethod(T t) {} }; } %} %inline %{ namespace ns { class NormalClass { public: NormalClass() {} ~NormalClass() {} }; template struct NormalTemplate { void tmethod(T t) {} }; class OuterClass { public: template struct Inner1 { template struct SuperInner1 { void method1(U t) {} }; template struct SuperInner2 { void method1(V t) {} }; template void tmethod(W w) {} template void tmethodAgain(X x) {} template struct SuperBase : public SuperInner1 { void method1(Y y) {} }; }; Inner1 useInner1(const Inner1& inner) { return inner; } template void InnerTMethod(Z z) {} template class Inner2 : public NormalTemplate { public: template class SuperInner1 { public: SuperInner1() {} void method1(U t) {} }; template struct SuperInner2 { void method1(V t) {} }; int embeddedVar; template void tmethod(X x) {} template struct SuperBase : public SuperInner1 { void method1(Y y) {} }; }; Inner2 useInner2(const Inner2& inner) { return inner; } int iii; }; struct ABC { ABC() {} ~ABC() {} }; struct TemplateFuncs { template X templateMethod1(X x) { return x; } template X templateMethod2(X x) { return x; } }; template struct OuterTemplate { template struct NestedInnerTemplate1 { template void NestedInnerInnerTMethod(Z z) {} void hohum() {} }; template void NestedInnerTMethod(UU u, W w) {} template struct NestedInnerTemplate2 { void hohum() {} }; UU hohum(UU u) { return u; } template struct NestedInnerTemplate3 : public NestedInnerTemplate2 { void hohum() {} }; struct NestedStruct { NestedStruct() {} void hohum() {} }; NestedInnerTemplate1 useNestedInnerTemplate1(const NestedInnerTemplate1& inner) { return inner; } NestedInnerTemplate2 useNestedInnerTemplate2(const NestedInnerTemplate2& inner) { return inner; } NestedInnerTemplate3 useNestedInnerTemplate3(const NestedInnerTemplate3& inner) { return inner; } NestedStruct useNestedStruct(const NestedStruct& inner) { return inner; } }; } %} %template(T_NormalTemplateNormalClass) ns::NormalTemplate; %template(T_OuterTMethodNormalClass) ns::OuterClass::InnerTMethod; %template(T_TemplateFuncs1Int) ns::TemplateFuncs::templateMethod1; %template(T_TemplateFuncs2Double) ns::TemplateFuncs::templateMethod2; %template(T_NestedOuterTemplateDouble) ns::OuterTemplate;