2010-12-27 10 views
0

Possible Duplicate:
Why doesn't a derived template class have access to a base template class' identifiers?C++, Schablone, Compiler-Fehler

Translating des folgenden Programms

Ah

#ifndef A_H 
#define A_H 
template <class T> 
class A 
{ 
    protected : 
    T a; 
    public: 
    A(): a(0) {} 
}; 
#endif 

Bh

#ifndef B_H 
#define B_H 
template <class T> 
class A; 

template <class T> 
class B: public A <T> 
{ 
    protected: 
    T b; 

    public: 
    B() : A<T>(), b(0) {} 
    void test() { b = 2 * a;} //a was not declared in this scope 
}; 
#endif 

verursacht einen Fehler: „ein nicht in dieser erklärt wurde Umfang". (Netbeans 6.9.1).

Aber der Bau

void test() { b = 2 * this->a;} 

ist richtig ... Wo ist das Problem?

Ist es besser, Forward-Deklaration oder Datei-Include-Direktive zu verwenden?

B.h

template <class T> 
class A; 

gegen

#include "A.h" 
+1

Lesen Sie http://www.comeaucomputing.com/techtalk/templates/#whythisarrow –

+0

Duplikat von [Warum hat eine abgeleitete Vorlagenklasse keinen Zugriff auf die Bezeichner einer Basisvorlagenklasse?] (Http: // stackoverflow. com/questions/1239908/why-doesnt-a-abgeleitet-template-class-have-access-to-a-base-template-class-identi) –

Antwort

0

A<T>::a ist ein abhängiger Name, so dass Sie es nicht unqualifiziertes verwenden.

Stellen Sie sich vor, dass es eine Spezialisierung der A<int> irgendwo war:

template<> class A<int> { /* no a defined */ }; 

Was soll der Compiler jetzt tun? Oder was, wenn A<int>::a eine Funktion anstelle einer Variablen war?

Qualifizieren Sie Ihren Zugang zu a, wie Sie bereits this->a entdeckt haben, und die Dinge werden richtig funktionieren.

+0

Oh, wie ich liebe, ohne Erklärung zu downvoted :( –

+0

Ihre Antwort ist Korrigiert, um Gegengewicht zu bilden. –

Verwandte Themen