Есть такая простая иерархия шаблонных классов
template<class T>
class A
{
protected:
void FooA() {}
}
template<class T>
class B : public A<T>
{
void FooB()
{
FooA(); // Ошибка компиляции
A<T>::FooA(); // А тут ошибки компиляции нет
}
}
Вызов функции FooA() недоступен из унаследованного класса, будет ошибка компиляции типа "Функция FooA() должна быть объявлена в прямой области видимости" (компилятор GNU, в студии такое может и пройдёт). Обращение к ней приходится делать через непосредственное указание базового класса: A<T>::FooA(), что не очень удобно. Можно залатать это, добавив в класс B строку:
...
using A<T>::FooA;
...
То же самое относится и к полям класса, не только к функциям.
Это не очень удобно — если у базового шаблонного класса есть много методов, которые нужно дёргать из класса-потомка, то для каждого придётся добавлять по такой строчке. Есть ли способы обойти эту проблему?