Почему я могу вызвать метод базового шаблона класса из производного класса
Я решил протестировать один из примеров в «Эффективном 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) не возражает ... Он даже не показывает никаких предупреждений.
Является ли приведенный выше код правильным или нет?