#include #include class A; class B { public: typedef int type; }; template class Wrapper { typedef typename Tag::type type; public: void print(void) { std::cout << "Here!\n"; } }; class Action { public: void doSomething(boost::shared_ptr > p); void doSomething(boost::shared_ptr > p) { p->print(); } }; int main(void) { boost::shared_ptr > p(new Wrapper); Action a; a.doSomething(p); }