Это не запрещено, только функции виртуального члена шаблона.
// valid
template<typename T> class MyContainer {
virtual void set(const T &) = 0;
}
// not valid
class MyContainer {
template <typename T> virtual void set (const T &) = 0;
}
Если я ошибся, рассмотрите возможность размещения образца кода.
изменить после добавления примера кода:
template <typename Datatype>
virtual // <-- nope, not here
Datatype MyContainer<Datatype>::Get()
{
// ...
}
virtual
является только частью объявления внутри тела класса. Это должно быть действительно:
template <typename Datatype>
Datatype MyContainer<Datatype>::Get()
{
// ...
}
Однако обратите внимание, что определение должно быть видно в момент создания шаблона. Поэтому либо поместите его в файл заголовка (либо в дополнительный заголовок, который вы затем включите в свой настоящий заголовок), либо оставьте его в теле класса.
(пожалуйста, никто не упоминает export
редактируемые шаблоны сейчас, мы с вами их много знаем, но они не совсем новичок, и устарели в следующем стандарте)