Ho codice che compila bene con VC9 (Microsoft Visual C++ 2008 SP1) ma non con GCC 4.2 (su Mac, se questo è importante). Se accumulo abbastanza qualificatori e parole chiave, posso forzarlo a lavorare in GCC, ma questo non sembra giusto.Sintassi C++ migliore per i typedef e le funzioni della classe base del modello?
Ecco un esempio di codice minima esporre i miei problemi:
template< typename N >
struct B {
typedef N n_type; // can derived class access typedef?
void foo() {} // can derived class access function?
};
template< typename N >
struct D : public B<N> {
typedef B<N> b_type;
typedef typename b_type::n_type bn_type;
void f1(n_type) {} // ERROR: 'n_type' has not been
// declared
void f2(typename B<N>::n_type) {} // OK, verbose
void f3(b_type::n_type) {} // ERROR: 'struct B<N>::n_type' is
// not a type
void f4(typename b_type::n_type) {} // OK, verbose
void f5(bn_type) {} // OK, verbose typedefs
void f6() { foo(); } // ERROR: there are no arguments to
// 'foo' that depend on a template
// parameter, so a declaration of
// 'foo' must be available
void f7() { b_type::foo(); } // OK, verbose
};
sono io sbagliato aspettarsi una classe template derivata da un'altra classe template per essere in grado di utilizzare typedef e funzioni ereditate direttamente? C'è un modo migliore per farlo rispetto a quello che ho inventato finora?
Qual è il punto di 'typedef N n_type'? puoi semplicemente usare 'N' direttamente – Trent
typedef non è ereditato, Visual C++ non è conforme agli standard spesso. è possibile accedere alle funzioni ereditate utilizzando la risoluzione dell'ambito, IE base :: f o questo-> f. puoi anche usare "using base :: f" per portare la funzione in ambito locale. – Anycorn
Funziona per me tranne per il caso di f3. –