
Have you tried
#include <boost/pointer_cast.hpp>
// in class
{ using boost::static_pointer_cast; static_pointer_cast<T>( ps ); }
under g++? Does it still fail? This is required to support the case where ps is a raw pointer.
This also fails. Simplified test case: //////////////////////////////////////// //raw_ptr.hpp header: //////////////////////////////////////// namespace raw_ptr { //static_pointer_cast overload for raw pointers template<class T, class U> inline T* static_pointer_cast(U *ptr) { return static_cast<T*>(ptr); } } //namespace raw_ptr //////////////////////////////////////// //container.hpp header: //////////////////////////////////////// namespace dummy { template<class Pointer> class container { public: void func() { using raw_ptr::static_pointer_cast; static_pointer_cast<int>(Pointer()); } }; } //namespace dummy { //////////////////////////////////////// //smart_ptr.hpp header: //////////////////////////////////////// namespace dummy { template<class T> class smart_ptr {}; template<class T, class U> smart_ptr<T> static_pointer_cast(const smart_ptr<U> &u) { return smart_ptr<T>(); } } //namespace dummy { //////////////////////////////////////// //main.cpp //////////////////////////////////////// int main() { using namespace dummy; typedef container<smart_ptr<int> > my_container; my_container cont; cont.func(); typedef container<int *> my_container2; my_container2 cont2; cont2.func(); return 0; } This compiles fine with with VC 7.1. g++ fails with: "no matching function for call to 'static_pointer_cast(dummy::smart_ ptr<int>)'" Regards, Ion