There is one another use case to use typedef is when we want to enable a kind of Container Independent code (but not exactly!)
Let us say you have class:
Class CustomerList{public: //some functionprivate: typedef list<Customer> CustomerContainer; typedef CustomerContainer::iterator Cciterator;};
The above code encapsulates the internal container implementation using typedef and even if in future the list container needs to changed to vector or deque still the user of the CustomerList class doesn't need to worry about exact container implementation.
Hence, the typedef encapsulates and somewhat help us to write Container Independent code