Ich habe C++ - Templating gelernt und bin auf seltsames Verhalten gestoßen. Betrachten Sie diese Klassenstruktur (abgespeckte von meinem ursprünglichen Code):Zugriff auf geerbte Objekte aus der Klassenvorlage
class A {
public:
std::vector <int> vec;
};
template <typename T> class B : public A { };
template <typename T> class C : public B<T> {
public:
using A::vec;
int test() {
return vec[1]; // OK
}
int test2() {
return vec.size(); // error: 'class A' has no member named 'size'
}
};
Beim Kompilieren, erhalte ich einen Fehler in test2
und sagte, dass class A
size
kein Mitglied hat. Aber vec
sollte ein vector
Objekt sein, keine Instanz von A
. In der Tat, wenn ich C
direkt von A
anstelle von B<T>
ableite oder die Vorlage von C
entferne, kompiliert es fein.
Außerdem, wenn ich die folgende Methode C
hinzufügen:
int test3() {
void ***v = vec; // error: cannot convert from
// 'std::vector<int,...>' to 'void***'
}
die Compiler sagt es nicht von einem vector<int>
zu void***
umwandeln kann, so dass es die richtige Art für vec
zu wissen scheint. Mache ich hier einen Fehler, oder ist das möglicherweise ein Fehler in meinem Compiler? Ich benutze eine Apple-Version von g ++ 4.2.1. Edit: scheint auch in späteren Versionen von g ++ aufzutreten.
Danke für Ihre Hilfe!
Zweite bearbeiten: mein Compiler ist glücklich, wenn ich this->vec.size()
in test2
, anstatt sich auf die using A::vec
Erklärung verwenden.
[Warum muss ich Vorlage Basisklasse Mitglieder durch die diesen Zeiger zugreifen?] (Http://stackoverflow.com/ q/4643074/341970) – Ali