%module template_specialization_using_declaration %include %inline %{ class ConcreteClass { int val; public: ConcreteClass(int i = 0) : val(i) {} int concrete_value() { return val; } }; namespace Space { // primary template class template struct BaseTemplate { void method_primary(T t) {} virtual ~BaseTemplate() {} protected: void method_primary_hidden(T t) {} }; // specialized template class template struct BaseTemplate { void method_specialization(T t) {} virtual ~BaseTemplate() {} protected: void method_specialization_hidden(T t) {} }; // partially specialized template class template<> struct BaseTemplate { void method_partial_specialization(int i) {} virtual ~BaseTemplate() {} protected: void method_partial_specialization_hidden(int t) {} }; } %} %template(BaseTemplateString) Space::BaseTemplate; %template(BaseTemplateConcreteClass) Space::BaseTemplate; %template(BaseTemplateInt) Space::BaseTemplate; %inline %{ namespace Space { // primary template class template struct DerivedTemplate : BaseTemplate { void method_primary_derived(T t) {} virtual ~DerivedTemplate() {} using BaseTemplate::method_primary_hidden; }; // specialized template class template struct DerivedTemplate : BaseTemplate { void method_specialization_derived(T t) {} virtual ~DerivedTemplate() {} using BaseTemplate::method_specialization_hidden; }; // partially specialized template class template<> struct DerivedTemplate : BaseTemplate { void method_partial_specialization_derived(int i) {} virtual ~DerivedTemplate() {} using BaseTemplate::method_partial_specialization_hidden; }; } %} %template(DerivedTemplateString) Space::DerivedTemplate; %template(DerivedTemplateConcreteClass) Space::DerivedTemplate; %template(DerivedTemplateInt) Space::DerivedTemplate;