Qualcuno sa perché le dichiarazioni di utilizzo non sembrano funzionare per l'importazione di nomi di tipi da classi di base dipendenti? Funzionano per variabili membro e funzioni, ma almeno in GCC 4.3, sembrano essere ignorati per i tipi.Accesso ai tipi da classi di base dipendenti
template <class T>
struct Base
{
typedef T value_type;
};
template <class T>
struct Derived : Base<T>
{
// Version 1: error on conforming compilers
value_type get();
// Version 2: OK, but unwieldy for repeated references
typename Base<T>::value_type get();
// Version 3: OK, but unwieldy for many types or deep inheritance
typedef typename Base<T>::value_type value_type;
value_type get();
// Version 4: why doesn't this work?
using typename Base<T>::value_type;
value_type get(); // GCC: `value_type' is not a type
};
Ho una classe di base con una serie di typedef allocator in stile che mi piacerebbe ereditare tutto diversi livelli di eredità. La soluzione migliore che ho trovato finora è la versione 3, ma sono curioso del perché la versione 4 non sembra funzionare. GCC accetta la dichiarazione d'uso, ma sembra ignorarlo.
Ho controllato lo standard C++, C++ Prog. Lang. 3a ed. [Stroustrup] e C++ Templates [Vandevoorde, Josuttis], ma nessuno sembra indicare se l'uso di dichiarazioni possa essere applicato a tipi di classi di base dipendenti.
Nel caso in cui aiuti a vedere un altro esempio, here is the same question being asked, ma non risponde realmente, sulla mailing list GCC. Il richiedente indica che ha visto "usare typename" altrove, ma che GCC non sembra supportarlo. Non ho un altro compilatore conforme disponibile per testarlo.
Invia un codice che dovrebbe essere compilato (secondo te) per i compilatori conformi, ma non lo fa. E pubblica come stai usando il modello. –
Credo che tutte le informazioni pertinenti siano sopra. Le versioni 1-4 funzionano su MSVC 9, che ha una risoluzione del nome a uno stadio non conforme (ad esempio al momento dell'istanziazione). Solo le versioni 2 e 3 funzionano su GCC 4.3. Non conosco alcun motivo per cui la Versione 4 dovrebbe essere non valida, ma GCC non lo accetterà. Per quanto riguarda l'utilizzo, non importa quanto sia stato istanziato. Sto solo cercando di ottenere la dichiarazione del modello da compilare. Il codice sopra riportato è una semplificazione di un adattatore contenitore molto più complesso. –
Quando postate il codice qui, non aspettatevi che le persone debbano modificarlo per farlo compilare. –