Ваш случай - удачный пример, потому что вы полностью специализируете шаблон. Другими словами, существует только один аргумент шаблона, и для функции, которую вы хотите специализировать, вы предоставляете полностью специализированную реализацию этого определения функции. К сожалению, для частичной специализации шаблонов классов требуется повторная реализация класса.
Например, это работает:
template<typename T, typename U>
struct Node
{
void function() { cout << "Non-specialized version" << endl; }
};
template<>
void Node<int, char>::function() { cout << "Specialized version" << endl; }
Частично специализированная версия, хотя не будет работать:
template<typename T, typename U>
struct Node
{
void function() { cout << "Non-specialized version" << endl; }
};
template<typename U>
void Node<int, U>::function() { cout << "Specialized version" << endl; }
То, что вы можете сделать, если окажетесь во втором сценарии, чтобы избежать ненужного дублирования кода, - это упаковать все общие элементы в общий базовый класс, а затем поместить все элементы, которые будут меняться с частичной специализацией в производном классе. Таким образом, вам не нужно дублировать весь общий код в базовом классе, вам нужно будет только переписать определения для специализированного производного класса.