Accesso ai membri protetti da sottoclassi: gcc vs msvc
-
10-07-2019 - |
Domanda
In Visual C ++, posso fare cose del genere:
template <class T>
class A{
protected:
T i;
};
template <class T>
class B : public A<T>{
T geti() {return i;}
};
Se provo a compilare questo in g ++, ricevo un errore. Devo fare questo:
template <class T>
class B : public A<T>{
T geti() {return A<T>::i;}
};
Non dovrei fare il primo in C ++ standard? Oppure qualcosa non è configurato correttamente con gcc e mi sta dando errori?
Soluzione
Questo era consentito, ma è stato modificato in gcc 3.4 .
In una definizione di modello, i nomi non qualificati non troveranno più i membri di una base dipendente (come specificato da [temp.dep] / 3 nello standard C ++). Ad esempio,
template <typename T> struct B {
int m;
int n;
int f ();
int g ();
};
int n;
int g ();
template <typename T> struct C : B<T> {
void h ()
{
m = 0; // error
f (); // error
n = 0; // ::n is modified
g (); // ::g is called
}
};
Devi rendere dipendenti i nomi, ad es. prefissandoli con this- > ;. Ecco la definizione corretta di C :: h,
template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
Altri suggerimenti
L'ho capito:
- Super FAQ C ++: " Perché ricevo errori quando il mio la classe derivata dal modello utilizza un tipo nidificato che eredita dalla sua classe base del modello? "
- Super FAQ C ++: " Perché ricevo errori quando il mio la classe derivata dal modello utilizza un membro che eredita dalla sua classe base del modello? "
Apparentemente, il primo esempio NON è C ++ valido ed è un male che msvc lo prenda. Esistono soluzioni pubblicate su C ++ faq lite.
Potresti voler leggere ricerca in due fasi del nome