Making copy of shared_ptr.hpp to implement generic version that can accept a class as the "pointer" type.