Я пометил ответ как "правильный",
но я не очень доволен. я не
спрашивать, КАК это работает; Я спрашиваю, почему это
был разработан таким образом. Как это
работы не кажутся мне последовательными
с ОО. Это даже кажется последовательным.
Почему функционирует шаблон
специализация имеет ограничение
что интерфейс должен быть согласованным,
в то время как специализация шаблона класса
не ??
Если бы это был ваш вопрос, вам, вероятно, следовало бы так сказать с самого начала.
Я собираюсь начать с последнего бита: почему функции требуют одинаковых подписей. Это легко, функции уже могут повторно использовать имена через перегрузку.
int f(int);
double f(double); //no templates needed
Разрешение специализации изменять сигнатуру функции без необходимости усложнит и без того сложный процесс разрешения имен, фактически не предоставляя никакой дополнительной функциональности.
В случае типов классов шаблон гораздо сложнее. Мало того, что у вас есть функции-члены для рассмотрения, у вас есть объекты-члены, typedefs, вложенные типы и так далее. Специализация всех тех. Если для SomeTemplatedObject<double>
требуется определенный закрытый член, который SomeTemplatedObject<T>
обычно не требуется, как вы можете специализировать SomeTemplatedObject
для double
без изменения «интерфейса»? Или что из методов, которые не имеют смысла для определенных типов? Или вложенные типы, которые необходимо изменить, чтобы сохранить согласованный интерфейс? И это даже не касается более широкой проблемы шаблонного метапрограммирования.
Вам даже не нужно иметь полный тип для общего случая.
template<typename T>
struct Object;
template<>
struct Object<int> { //what interface does this need?
typedef int type;
};
Если вы чувствуете необходимость придерживаться некоего пуристического определения ОО, тогда вы всегда можете просто не специализировать шаблоны без точного соответствия их первоначальному расположению.