Neil ti ha dato la tua risposta. Detto questo, si potrebbe desiderare di fare una sfilza di typedef e di usare quelli, in modo che il lavoro non diventi così noioso (e aumenta la leggibilità):
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
}
};
E 'abbastanza comune per essere liberale con l'uso di typedef di .
Inoltre, ereditare da un contenitore standard potrebbe essere una cattiva idea, dal momento che non sono fatti apposta per una cosa del genere. Ad esempio, una funzione gratuita è spesso la best choice se stai cercando alcune estensioni in un contenitore.
@anon: Do by change ha un elenco di casi in cui il nome di tipo è obbligatorio. Cheers (+1) – ezdazuzena