В вашем базовом шаблоне класса:
virtual void foo(const typename V::t_args&) =0;
Это ссылка на некоторый внутренний класс или тип с именем t_args
его параметра шаблона V
. При ссылке на член класса определение класса должно быть полным (чтобы выяснить, что такое t_args
). Вы пытаетесь использовать этот класс шаблона следующим образом:
class Derived : public IBase<double, Derived>
Вы передаете Derived
для вашего V
, однако его определение класса неполное. Если базовый класс шаблона ссылается только на свой параметр V
, это обычно нормально. Однако вашему шаблону требуется, чтобы его тип параметра шаблона был завершенным, потому что ему нужно знать, что это за t_args
, и ваш производный класс не завершен, пока он не будет полностью определен. Но он не может быть полностью определен, пока его базовый класс не будет полностью определен. Вроде как курица против яйца.
Не существует готового решения для такого рода круговой ссылки, своего рода. Единственное, что можно сделать - это реструктурировать класс, поэтому ваш тип «аргумента» - это независимый класс, а не производный класс.