2010-06-06 13 views
5

Próbuję zrozumieć whay pojawia się błąd w tym kodzie: (błąd jest pod g ++ unix kompilator VS kompiluje OK.)problem z dziedziczenia szablonów

template<class T> class A { 
public: 
    T t; 
public: 
    A(const T& t1) : t(t1) {} 
    virtual void Print() const { cout<<*this<<endl;} 
    friend ostream& operator<<(ostream& out, const A<T>& a) { 
      out<<"I'm "<<typeid(a).name()<<endl; 
      out<<"I hold "<<typeid(a.t).name()<<endl; 
      out<<"The inner value is: "<<a.t<<endl; 
      return out; 
    } 
}; 

template<class T> class B : public A<T> { 
public: 
    B(const T& t1) : A<T>(t1) {} 
    const T& get() const { return t; } 
}; 

int main() { 
    A<int> a(9); 
    a.Print(); 
    B<A<int> > b(a); 
    b.Print(); 
    (b.get()).Print(); 
    return 0; 
} 

Ten kod daje następujące błąd:

main.cpp: w funkcji członka 'const T & B :: get() const':
main.cpp: 23: error: 't' nie został zadeklarowany w tym zakresie

It skompilowałem, kiedy i zmieniony kod B do tego:

template<class T> class B : public A<T> { 
public: 
    B(const T& t1) : A<T>(t1) {} 
    const T& get() const { return A<T>::t; } 
}; 

ja po prostu nie mogę zrozumieć, na czym polega problem z pierwszym kodem ...
To nie ma sensu, że naprawdę muszę napisać „A ::” każdy time ...

Odpowiedz

7

Możesz również użyć this->t, aby uzyskać dostęp do elementu szablonu klasy podstawowej.

Nazwa t nie jest zależna od parametru szablonu T, więc nie jest nazwą zależną. Klasa podstawowa A<T> jest oczywiście zależna od parametru szablonu T i dlatego jest zależną klasą podstawową. Nazwy niezależne nie są wyszukiwane w zależnych klasach bazowych. A detailed description of why this is the case can be found in the C++ FAQ Lite.

+2

Często zadawane pytania nie zgadzają się z tym, dlaczego "ten->" działa. Porównaj to ze Standardem (podkreślenie przeze mnie). Najczęściej zadawane pytania: "Ponieważ w szablonie jest to zawsze domyślnie zależne, to-> f * jest zależne i dlatego odnośnik jest odroczony *, dopóki szablon nie zostanie faktycznie utworzony, * w którym momencie wszystkie klasy bazowe są uważane za *", Standard: ". ... zakres kategorii podstawowej * nie jest badany * podczas niewykwalifikowanego wyszukiwania nazw w punkcie definicji szablonu lub elementu klasy * lub podczas tworzenia * szablonu lub elementu klasy. ". Najczęściej zadawane pytania mówią, że został znaleziony, ponieważ jest zależny, ale to źle. –

+1

GCC również implementuje tę błędną interpretację iw rezultacie [ma otwarte raporty o błędach] (http://gcc.gnu.org/bugzilla/show_bug.cgi?id=43282) –

Powiązane problemy