Zugriff auf geschützte Mitglieder von Unterklassen: gcc vs msvc
-
10-07-2019 - |
Frage
In Visual C ++, ich kann wie folgt durchführen:
template <class T>
class A{
protected:
T i;
};
template <class T>
class B : public A<T>{
T geti() {return i;}
};
Wenn ich versuche, dies in g ++ zu kompilieren, erhalte ich einen Fehler. Ich habe dies zu tun:
template <class T>
class B : public A<T>{
T geti() {return A<T>::i;}
};
Soll ich nicht das erstere in Standard C ++ tun? Oder ist etwas falsch konfiguriert mit gcc, die mir Fehler ist zu geben?
Lösung
Die verwendeten erlaubt zu werden, aber geändert in gcc 3.4 .
In einer Template-Definition werden nicht qualifizierte Namen nicht mehr Mitglieder einer abhängigen Basis finden (wie durch [temp.dep] / 3 in dem C ++ Standard). Zum Beispiel:
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
}
};
Sie müssen die Namen abhängig machen, z.B. indem man sie mit this- prefixing>. Hier ist die korrigierte Definition von C :: h,
template <typename T> void C<T>::h ()
{
this->m = 0;
this->f ();
this->n = 0
this->g ();
}
Andere Tipps
Ich dachte, dies heraus:
- C ++ Super-FAQ: „Warum bin ich Fehler bekommen, wenn meine Vorlage -abgeleitetes-Klasse verwendet eine verschachtelte Art es von seiner Vorlage-base-Klasse erbt? "
- C ++ Super-FAQ: „Warum bin ich Fehler bekommen, wenn meine Vorlage abgeleitete Klasse verwendet ein Mitglied aus seiner Vorlage-base-Klasse erbt? "
Anscheinend ist das erste Beispiel nicht gültig C ++ und es ist schlecht, dass msvc dies geschieht. Es gibt Lösungen auf der C ++ FAQ Lite veröffentlicht.
Sie können über Zwei-Phasen-Namen-Suche lesen möchten