%module duplicate_class_name_in_ns %rename(XA) A::X; %rename(XB) B::X; %inline %{ namespace A { class X { public: X(){}; }; template class Foo { public: Foo(){}; }; class Bar { public: Bar(){}; }; template class Baz { public: Baz(){}; }; } namespace B { // non-template derived from non-template class X : public A::X { public: X(){}; A::X do_x(){return A::X();} }; // template derived from template with different template args template class Foo : public A::Foo { public: Foo(){}; A::Foo do_foo(){return A::Foo();} }; // template derived from non-template template class Bar : public A::Bar { public: Bar(){}; A::Bar do_bar(){return A::Bar();} }; // template derived from template with same template args template class Baz : public A::Baz { public: Baz(){}; A::Baz do_baz(){return A::Baz();} }; } %} %template(AFoo) A::Foo; %template(ABaz) A::Baz; %template(BFoo) B::Foo; %template(BBar) B::Bar; %template(BBaz) B::Baz; %inline %{ A::X get_a_x() {B::X x; return x.do_x();} A::Foo get_a_foo() {B::Foo x; return x.do_foo();} A::Bar get_a_bar() {B::Bar x; return x.do_bar();} A::Baz get_a_baz() {B::Baz x; return x.do_baz();} %}