Наследование шаблонного класса
От: Кузнец Россия  
Дата: 11.10.16 12:15
Оценка:
Есть такая простая иерархия шаблонных классов

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;
...


То же самое относится и к полям класса, не только к функциям.

Это не очень удобно — если у базового шаблонного класса есть много методов, которые нужно дёргать из класса-потомка, то для каждого придётся добавлять по такой строчке. Есть ли способы обойти эту проблему?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.