template <typename T, class Container>
class Stack
{
protected:
Container c_;
public:
typedef T ValueType;
// assumption: T and Container::ValueType are the same type
void Push (const ValueType& t) { c_.PushBack(t); }
void Pop () { c_.PopBack(); } // Precondition: !Empty()
ValueType& Top () { return c_.Back(); } // Precondition: !Empty()
bool Empty () const { return c_.Empty(); }
unsigned int Size () const { return c_.Size(); }
void Clear () { c_.Clear(); }
} ;