Тип Foo_T не будет найден в базовом классе при использовании в производном конструкторе (Bar).
Bar (const foo_arg_t bar_arg, const a_arg_t a_arg)
: Foo<T>(bar_arg) // base-class initializer
{
Foo_T = TypeA(a_arg); TypeA, etc. // Won't compile, per the standard
}
Это соответствует стандарту C ++, согласно которому неквалифицированные имена, как правило, не зависят, и их следует искать, когда шаблон полностью определен.
Поскольку определение базового класса шаблона в то время еще не было известно (могут быть полностью специализированные экземпляры шаблона, извлекаемого позднее в модуле компиляции), неквалифицированные имена никогда не разрешаются в имена в зависимых базовых классах.
Если вам нужно имя из базового класса, когда используются шаблоны, вы должны либо полностью квалифицировать их, либо сделать их неявно зависимыми в вашем производном классе.
Foo< T >::Foo_T = TypeA(a_arg); // fully qualified will compile
или сделать его зависимым
this->Foo_T = TypeA(a_arg);
Поскольку this
делает его зависимым от шаблона, разрешение типа откладывается до "фазы 2" создания шаблона (а затем базовый класс также полностью известен)
Обратите внимание, что если вы хотите использовать функцию из базового класса, вы могли бы также добавить объявление использования ..
(внутри бара ())
some_foo_func(); // wouldn't work either
using Foo<T>::some_foo_func;
some_foo_func(); // would work however