#include <iostream>
#include <string>

using namespace std;

template <class T>
class SmartPtr
{
public:
	SmartPtr (T *ptr = 0) : m_ptr(ptr) {}
	SmartPtr (const SmartPtr & zgr) :m_ptr(zgr.m_ptr) {}
	const SmartPtr &operator= (const SmartPtr &zgr)
	{
		m_ptr = zgr.m_ptr;
		return zgr;
	}

	T* operator->() {return m_ptr;}
	T& operator*() {return *m_ptr;}

	~SmartPtr () {delete m_ptr;}

private:
	T *m_ptr;

};

int main()
{
	SmartPtr<string> b (new string ("abc"));

	cout << b->c_str();
	cout << (*b).c_str();

	return 0;
}

