[ Peter Dimov adds: ]
shared_ptr<T> and weak_ptr<T> support all types T for which T* is valid. In other words, a possible (partial) resolution is to change class T to PointeeType T for shared_ptr, weak_ptr and possibly enable_shared_from_this.