Listing 2

// synopsis of template class weak_ptr

template <class Ty> class weak_ptr {
public:
  typedef Ty element_type;

  weak_ptr();
  weak_ptr(const weak_ptr& wp);
  template<class Other>
    weak_ptr(const weak_ptr<Other>& wp);
  template<class Other>
    weak_ptr(const shared_ptr<Other>& sp);

  weak_ptr& operator=(const weak_ptr& sp);
  template<class Other>
    weak_ptr& operator=(const weak_ptr<Other>& sp);
  template<class Other>
    weak_ptr& operator=(const shared_ptr<Other>& ap);

  void swap(weak_ptr& sp);
  void reset();

  long use_count() const;
  bool expired() const;
  shared_ptr<Ty> lock() const;
};