Вы не можете объявлять / определять шаблонные виртуальные функции. Причина в том, что механизм виртуальной диспетчеризации должен быть известен, когда компилятор видит определение базового класса, но шаблоны компилируются по требованию.
В обычной реализации vtable проблема заключается в том, что количество записей, которые компилятор должен зарезервировать для виртуальной функции, не определено (сколько может быть различных экземпляров типа?), А также их порядок. Если вы объявляете класс:
class base {
public:
virtual void foo();
virtual int bar();
};
Компилятор может зарезервировать две записи в виртуальной таблице для указателей на foo
и bar
в виртуальной таблице, и виртуальная таблица идеально определяется только путем проверки определения класса. Этого нельзя достичь с помощью шаблонных функций.