Проблема не в наследовании, а в том, что шаблон наследуется от экземпляра другого шаблона, передавая свой собственный аргумент шаблона в качестве параметра.То есть он наследуется от зависимого типа (MyClass<T>
зависит от типа T
).
Язык требует проверки шаблона перед выполнением подстановки типа и во время этого первого проходавсе независимые имена проверены.Когда компилятор видит fptr
, он не зависит от типа T
, поэтому он пытается найти его вне вашего шаблона как символ уровня пространства имен и завершается ошибкой.Не допускается создание экземпляра MyBase
с типом (нет типа для подстановки), и поэтому целое MyBase
является неизвестным, и никакие символы не могут быть там найдены (без замены типа компилятор не может знатьсуществует ли конкретная специализация MyBase
).
Самое простое решение - добавить локальный typedef:
typedef MyBase<T> base_type;
typedef typename base_type::fptr fptr;
или полностью квалифицировать вызов:
void doSomething( typename MyClass<T>::fptr ) ...