Почему я могу вызвать метод базового шаблона класса из производного класса

Я решил протестировать один из примеров в «Эффективном C ++» и не получил ожидаемого результата. Итак, по-видимому, этот (упрощенный) код не должен компилироваться:

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

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

Вот объяснение (имена классов изменены для простоты):

Приведенный выше код не будет компилироваться, по крайней мере, с помощью совместимых компиляторов. Такие компиляторы будут жаловаться, чтоf не существует Мы видим, чтоf находится в базовом классе, но компиляторы не будут искать его там.

Нам нужно понять почему. Проблема в том, что когда компиляторы встречают определение для шаблона классаBони не знают, от какого класса он наследует. Конечно этоA<T>, ноT это параметр шаблона, который не будет известен позжеB создается) Не зная чтоT есть, нет никакого способа узнать, что классA<T> выглядит как. В частности, нет способа узнать, есть ли у негоf функция.

Мой компилятор (Visual Studio) не возражает ... Он даже не показывает никаких предупреждений.

Является ли приведенный выше код правильным или нет?

Ответы на вопрос(1)

Ваш ответ на вопрос