Во-первых, это не совсем поддерживаемая вещь в C ++. К сожалению, специализация шаблона требует переопределения всех методов.
Вы можете поместить свои общие методы в базовый класс, а затем включить их по наследству, хотя мой собственный опыт с этим был смешанным (функция в родительском классе просто не ведет себя так же, как функция в дочернем классе во всех случаях, дружба работает странно, и если базовый класс также является шаблоном, вы должны полностью указать его всякий раз, когда вы хотите использовать любой из его членов [кроме компиляторов MS]. Операторы никогда не работают так, как ну тоже). Вы можете сделать это, скопировав ваши обычные методы, а это именно то, чего вы пытаетесь избежать. Или, в качестве компромисса по вставке копий, вы можете попросить компилятор сделать вставку для вас:
template<> struct Widget<char>
{
#include "Widget_common.hpart"
int uncommon_fn() { return 2; }
};
Затем вы создаете файл с именем "Widget_common.hpart", который содержит
// This file contains common functions for the Widget<> template, and will be #included
// directly into that template; it should not be included as a standalone header.
char common_fn() { return 'a'; }
Вы также можете использовать стандартное расширение .h, я полагаю. Это, безусловно, злоупотребление препроцессором, но оно делает то, о чем вы просите, избегает головной боли при наследовании шаблонов (а они действительно весьма болезненны) и позволяет вам хранить только одну копию вашего общего кода. И если кто-то хочет критиковать, что это за ужасный клуг, сделайте это с помощью улучшенного решения;).