Uczyłem się szablonowania w C++ i przeszedłem przez jakieś dziwne zachowanie. Rozważmy tę strukturę klasy (uproszczoną z mojego oryginalnego kodu):Uzyskiwanie dostępu do dziedziczonych obiektów z szablonu klasy
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'
}
};
Podczas kompilacji, pojawia się błąd w test2
, mówiąc, że class A
ma człon size
. Ale vec
powinien być obiektem vector
, a nie instancją A
. Rzeczywiście, jeśli wyprowadzę C
bezpośrednio z A
zamiast B<T>
, lub usuń szablon z C
, kompiluje się dobrze.
Ponadto, jeśli dodać następującą metodę C
:
int test3() {
void ***v = vec; // error: cannot convert from
// 'std::vector<int,...>' to 'void***'
}
kompilator mówi, że nie można przekonwertować z vector<int>
do void***
, więc wydaje się znać właściwy typ dla vec
. Czy popełniam tu błąd, czy może jest to błąd w moim kompilatorze? Używam wersji g ++ 4.2.1 Apple. Edycja: wydaje się również występować w późniejszych wersjach g ++.
Dzięki za pomoc!
Druga edycja: mój kompilator jest szczęśliwy, jeśli mogę użyć this->vec.size()
w test2
zamiast opierania się na deklaracji using A::vec
.
[Dlaczego mam dostęp do szablonów członków klasy bazowej za pośrednictwem tego wskaźnika?] (Http://stackoverflow.com/ q/4643074/341970) – Ali