2011-02-07 14 views
7

Możliwe duplikaty:
[FAQ]Why doesn't a derived template class have access to a base template class' identifiers? Problem with protected fields in base class in c++
cannot access data member in a class templateklasa C++ szablonu i dziedziczenie

następujący kod daje mi błąd kompilacji. Co jest nie tak?

struct Base { 
    int amount; 
}; 

template<class T> struct D1 : public Base { 
}; 

template<class T> 
struct D2 : D1<T> { 
    void foo() { amount=amount*2; /* I am trying to access base class data member */ }; 
}; 

int main() { 
    D2<int> data; 
}; 


test.cpp: In member function 'void D2<T>::foo()': 
test.cpp:11: error: 'amount' was not declared in this scope 

Jak to naprawić?

dzięki

+0

Widziałem już to pytanie kilka razy wcześniej, ale nie mogę znaleźć linku. –

+0

Znaleziono jeden, ale jeśli ktoś może znaleźć taki, który ma lepsze pytanie, które byłoby świetne: [Problem z chronionymi polami w klasie bazowej w C++] (http://stackoverflow.com/questions/1813671/problem-w-protected- field-in-base-class-in-c) –

+2

@ Chris: Tutaj jest [duplikat] (http://stackoverflow.com/questions/4210108/cannot-access-data-member-in-a-class-template) , a tutaj jest [długie wyjaśnienie] (http://stackoverflow.com/questions/4643074/why-do-i-have-to-access-template-base-class-members-through-tis-this-pointer). – GManNickG

Odpowiedz

8

Problemem tutaj ma do czynienia z jak nazwy są spojrzał w klasach szablonów, które dziedziczą z klasy bazowej szablon. Rzeczywiste zasady stojące za tym są dość tajemnicze i nie znam ich z mojej głowy; Zwykle muszę zapoznać się z referencją, aby dowiedzieć się dokładnie, dlaczego to nie działa.

Sposób, aby rozwiązać ten jest jawnie poprzedzić członek masz dostęp z this->:

void foo() { 
    this->amount = this->amount * 2; // Or: this->amount *= 2; 
} 

Daje kompilator jednoznaczną wskazówkę o tym, gdzie nazwa pochodzi od amount i powinno rozwiązać błąd kompilatora.

Jeśli ktoś chce podać dokładniejszy opis przyczyny tego błędu, chciałbym zobaczyć dobre wyjaśnienie.

+1

Powodem błędu jest to, że kompilator nie przyjmuje żadnych założeń dotyczących członków bazowych szablonu szablonu w przypadku częściowej specjalizacji klasy bazowej, która nie obejmuje niektórych z tych elementów. – Gorpik

+0

Dzięki. To działa! – anon

+0

Według [this] (http://www.hackcraft.net/cpp/templateInheritance/): "Warto zauważyć, że baza jest taka, że ​​żadna z jej funkcji składowych nie jest tworzona, dopóki nie zostanie określony typ T." Tak więc kompilator może nie wiedzieć w czasie definicji żadnego z członków, a nie tylko funkcji. – jswolf19

Powiązane problemy