2012-11-14 11 views
6

Wenn ich eine Kette von Vererbung wie das folgende Beispiel verwende ich Vars aus tiefster Basis ohne Probleme nutzen könnten:rekursive Vererbung mit variadische Vorlagen und vererbte Parameter Probleme

class A { public: int x; }; 
    class B : public A { }; 
    class C: public B { public: void Do() { cout << x << endl; } }; 

Wenn ich mit rekursiven variadische das gleiche tun Template-Klassen konnte ich nicht auf meine Vars zugreifen. Irgendeine Idee, wie man auf die Vars zugreift und warum ich meine Vars nicht sehen kann?

template <class ...Parms> 
    class Example; 

    template <class Head, class ...Parms> 
    class Example<Head, Parms...>: public Example<Parms...> 
    { 
    }; 

    template <> 
    class Example<> 
    { 
     public: 
     int x; 
    }; 

    template <class ...Parms> 
    class Last: public Example<Parms...> 
    { 
     void Do() { cout << x << endl; } 
    }; 

Kompilierung schlägt fehl, bevor eine Instanz der Klasse instanziiert wird!

Antwort

6

x ist ein abhängiger Name in diesem Fall, so müssen Sie, wenn als this->x Zugriff (oder in Umfang bringen, indem Sie eine using-Deklaration in der Klassendefinition setzen:

using Example<Params...>::x; 

EDIT

Der Grund dafür wird in [temp.res] im Standard diskutiert: Grundsätzlich: Wenn der Compiler Ihre Vorlage analysiert, sieht er nur x. Es kann nicht wissen, dass x von den Parametern der Vorlage abhängt (was sie tut Ihr Fall, weil es von einer Basisklasse kommt, die von ihnen abhängt). Daher versucht der Compiler x mit dem, was es weiß, beim Analysieren der Vorlage zu lösen, und schlägt fehl.

Schreiben this->x zeigt an, dass sich x auf ein Mitglied der Klasse bezieht; Da eine Basisklasse Ihrer bestimmten Klasse von Vorlagenparametern abhängt, weiß der Compiler, dass er beim Analysieren der Vorlage x nicht auflösen kann, und verschiebt die Auflösung, bis die Vorlage instanziiert wird. Zu diesem Zeitpunkt sind die Vorlagenargumente bekannt. Das gleiche gilt für using Example<Params...>::x;. Das sagt auch dem Compiler, dass x von Template-Parametern abhängt, und seine Auflösung muss auf Instanitation verschoben werden.

+0

Ok, das-> x Arbeit, aber ich muss sagen: Ich verstehe nicht den Unterschied zwischen dem Zugriff auf x und this-> x für Datenmitglieder. Kann mir jemand erklären, warum das passiert? – Klaus

+1

@Klaus Ich habe die Antwort bearbeitet, um eine Erklärung zu geben. – Angew

Verwandte Themen