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?

questionAnswers(1)

yourAnswerToTheQuestion