Здесь базовый класс не является независимым базовым классом (что означает класс с полным типом, который может быть определен без знания аргументов шаблона), а _foo_arg
является независимым именем. Стандарт C ++ говорит, что независимые имена не ищутся в зависимых базовых классах.
Чтобы исправить код, достаточно сделать имя _foo_arg
зависимым, потому что зависимые имена можно искать только во время создания экземпляра, и в это время будет известна точная базовая специализация, которая должна быть изучена. Например:
// solution#1
std::cout << this->_foo_arg << std::endl;
Альтернатива заключается во введении зависимости с использованием квалифицированного имени:
// solution#2
std::cout << Foo<T>::_foo_arg << std::endl;
Необходимо соблюдать осторожность с этим решением, потому что если неквалифицированное независимое имя используется для формирования вызова виртуальной функции, то квалификация запрещает механизм виртуального вызова, и значение программы изменяется.
И вы можете принести имя из зависимого базового класса в производный класс один раз с помощью using
:
// solution#3
template <class T>
class Bar : public Foo<T> {
public:
...
void BarFunc ();
private:
using Foo<T>::_foo_arg;
};
template <class T>
void Bar<T>::BarFunc () {
std::cout << _foo_arg << std::endl; // works
}