Neil le ha dado su respuesta. Dicho esto, es posible que desee hacer una serie de typedef y utilizando aquellos, por lo que su trabajo no se convierta en tan tedioso (y que aumenta la legibilidad):
template <typename T>
class myList : public std::list<T>
{
public:
typedef T value_type;
typedef const T const_value_type;
typedef value_type& reference;
typedef const_value_type& const_reference;
typedef value_type* pointer;
typedef const_value_type* const_pointer;
typedef std::list<T> base_container;
typedef typename base_container::iterator iterator;
typedef typename base_container::const_iterator const_iterator;
void foo()
{
iterator it; // easy peasy
}
};
Es bastante común que sean liberales con su uso de typedef .
Además, heredar de un contenedor estándar puede ser una mala idea, ya que en realidad no están hechos para tal cosa. Por ejemplo, una función gratuita suele ser best choice si está buscando extensiones para un contenedor.
@anon: Do by change tiene una lista de casos donde el typename es obligatorio. Cheers (+1) – ezdazuzena