%module template_specialization %rename(not1) *::operator!() const; %rename(negate) *::operator-() const; %warnfilter(SWIGWARN_PARSE_TEMPLATE_FORWARD) vfncs::OnlySpecialized; %inline %{ namespace vfncs { template struct UnaryFunction { UnaryFunction operator-() const { return *this; } }; template <> struct UnaryFunction { // This works // UnaryFunction operator!() const; // This doesn't UnaryFunction operator!() const { return *this; } // Does this? void foo(UnaryFunction) { } }; // Also test specialization with only primary template forward declaration template struct OnlySpecialized; template <> struct OnlySpecialized { void bar(const OnlySpecialized& other) { } }; } %} namespace vfncs { %template(UnaryFunction_double) UnaryFunction; %template(UnaryFunction_bool) UnaryFunction; // Specialized instantiation with only primary template forward declaration %template(OnlySpecialized_int) OnlySpecialized; // Primary instantiation with only primary template forward declaration %template(OnlySpecialized_double) OnlySpecialized; // ignored with a warning } %{ namespace vfncs { template struct OnlySpecialized { int primary() const { return 0; } }; } %} %inline %{ namespace vfncs { // Use primary template with only primary template forward declaration (for SWIG, but full declaration seen by compiler) OnlySpecialized factory(OnlySpecialized* os) { OnlySpecialized ret = os ? *os : OnlySpecialized(); ret.primary(); return ret; } } %}