Dlaczego mogę wywołać metodę klasy szablonu bazowego z klasy pochodnej
Zdecydowałem się przetestować jeden z przykładów w „Effective C ++” i nie otrzymałem oczekiwanego rezultatu. Najwyraźniej ten (uproszczony) kod nie powinien się kompilować:
template <class T>
struct A {
void f(){}
};
template <class T>
struct B : public A <T> {
void f2() { f(); } // calling base function - will not compile
};
Oto wyjaśnienie (nazwy klas zmieniono dla uproszczenia):
Powyższy kod nie skompiluje się, przynajmniej nie z kompilatorami zgodnymi. Takie kompilatory będą narzekaćf
nie istnieje. Widzimy tof
jest w klasie bazowej, ale kompilatory nie będą go tam szukać.
Musimy zrozumieć dlaczego. Problem polega na tym, że gdy kompilatory napotykają definicję szablonu klasyB
, nie wiedzą, z której klasy dziedziczą. Jasne, że takA<T>
, aleT
to parametr szablonu, który nie będzie znany aż do później (kiedyB
jest tworzony). Nie wiedząc coT
jest, nie ma sposobu, aby dowiedzieć się, co klasaA<T>
wygląda jak. W szczególności nie ma możliwości sprawdzenia, czy maf
funkcjonować.
Mój kompilator (Visual Studio) nie ma nic przeciwko ... Nie wyświetla nawet żadnych ostrzeżeń.
Czy powyższy kod jest poprawny?