Вы смешиваете два разных понятия: наследование и специализация шаблона.
Ваш класс не является специализацией шаблона, но он получает из шаблона создания. Однако этот шаблон не может быть создан, потому что когда T = char *
оператор Value = buffer[offset];
имеет ошибку несоответствия типов.
Если вы хотите написать специализацию шаблона, то синтаксис будет
template<>
class ProductTableItem<char *> {
...
};
Обратите внимание, что два экземпляра шаблонов являются вообще несвязанными типами с точки зрения наследования ...
Может быть решение для того, что вы пытаетесь сделать, это что-то вроде
// Non-template base class
class ProducTableItemBase {
protected:
...
public:
virtual bool LoadFromBuffer(const BYTE* buffer, int count) = 0;
};
// Template class for all other types
template<typename T>
class ProductTableItem : public ProductTableItemBase {
T Value;
bool LoadFromBuffer(const BYTE* buffer, int count) {
...
}
};
// Template specialization for char*
template<>
class ProductTableItem<char *> : public ProductTableItemBase {
char * Value;
bool LoadFromBuffer(const BYTE* buffer, int count) {
...
}
};
Я сказал, может быть , потому что на самом деле мне не ясно, чего вы пытаетесь достичь.