Por que posso chamar o método de classe de modelo base da classe derivada

Decidi testar um dos exemplos em "C ++ efetivo" e não estou obtendo o resultado esperado. Então, aparentemente esse código (simplificado) não deveria compilar:

template <class T>
struct A {
    void f(){}
};

template <class T>
struct B : public A <T> {
    void f2() { f(); }   // calling base function - will not compile
};

Aqui está a explicação (os nomes das classes foram alterados para simplificar):

O código acima não irá compilar, pelo menos não com compiladores em conformidade. Esses compiladores vão reclamar quef não existe. Nós podemos ver issof está na classe base, mas os compiladores não irão procurá-lo lá.

Nós precisamos entender o porquê. O problema é que, quando os compiladores encontram a definição para o modelo de classeB, eles não sabem de que classe herda. Com certeza éA<T>, masT é um parâmetro modelo, que não será conhecido até mais tarde (quandoB é instanciado). Sem saber o queT é, não tem como saber qual a classeA<T> parece. Em particular, não há como saber se tem umf função.

Meu compilador (Visual Studio) não se importa ... Ele nem mostra nenhum aviso.

O código acima está correto ou não?

questionAnswers(1)

yourAnswerToTheQuestion