%module smart_pointer_namespace2 %{ namespace one { template class Ptr { T* p; public: Ptr(T *tp) : p(tp) {} ~Ptr() { }; T* operator->() { return p; } }; } namespace one { class Obj1 { public: Obj1() {} void donothing() {} }; typedef one::Ptr Obj1_ptr; } namespace two { class Obj2 { public: Obj2() {} void donothing() {} }; typedef one::Ptr Obj2_ptr; } %} namespace one { template class Ptr { T* p; public: Ptr(T *tp) : p(tp) {} ~Ptr() { }; T* operator->() { return p; } }; } namespace one { class Obj1 { public: Obj1() {} void donothing() {} }; typedef one::Ptr Obj1_ptr; %template(Obj1_ptr) one::Ptr; } namespace two { class Obj2 { public: Obj2() {} void donothing() {} }; typedef one::Ptr Obj2_ptr; } using two::Obj2; %template(Obj2_ptr) one::Ptr;