2012-11-14 9 views
6

Jeśli używam łańcuch dziedziczenia jak w poniższym przykładzie mogę używać vars z najgłębszej podstawy bez żadnych problemów:Recursive dziedziczenie z zmiennej liczbie argumentów szablonów i odziedziczonych problemów parametrów

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

Jeśli zrobić to samo z rekurencyjnej o zmiennej liczbie argumentów klasy szablonów Nie mogłem uzyskać dostępu do moich vars. Każdy pomysł, jak uzyskać dostęp do vars i dlaczego nie widziałem moich vars?

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; } 
    }; 

Kompilacja kończy się niepowodzeniem, zanim wystąpi instancja klasy!

Odpowiedz

6

x jest zależne nazwa w tym przypadku, więc trzeba przejść, jeśli jako this->x (lub dostosowania go do zakresu poprzez umieszczenie przy użyciu deklaracji w definicji klasy:

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

EDIT

Powód tego jest omówiony w [temp.res] w standardzie.Zasadniczo: gdy kompilator parsuje twój szablon, widzi tylko x. Nie ma możliwości, aby wiedzieć, że x zależy od parametrów szablonu (co robi w twoja sprawa, ponieważ pochodzi z klasy bazowej, która zależy od nich). W związku z tym kompilator próbuje rozwiązać x przy użyciu tego, co wie podczas analizowania szablonu, i kończy się niepowodzeniem.

Pisanie this->x wskazuje, że x odnosi się do członka klasy; ponieważ klasa bazowa danej klasy zależy od parametrów szablonu, kompilator wie, że nie może rozwiązać x podczas analizowania szablonu i odłoży rozdzielczość, dopóki nie zostanie utworzony szablon. W tym czasie znane są argumenty szablonu.

To samo dotyczy using Example<Params...>::x;. To również mówi kompilatorowi, że x zależy od parametrów szablonu, a jego rozdzielczość musi zostać przesunięta do instancji.

+0

OK, to-> x pracy, ale muszę powiedzieć: Nie rozumiem różnicy między dostępem do x i this-> x dla członków danych. Czy ktoś może wyjaśnić, dlaczego tak się dzieje? – Klaus

+1

@Klaus Edytowałem odpowiedź, aby podać wyjaśnienie. – Angew

Powiązane problemy