Любой ответ на этот вопрос сводится к «потому что так говорится в стандарте».Однако вместо того, чтобы читать стандартное, давайте рассмотрим, что еще запрещено (потому что ошибки помогают нам понять, чего ожидает язык).Случай «одного шаблона» довольно быстро исчерпан, поэтому давайте рассмотрим следующее:
template<class T>
class A
{
template<class X>
void foo(X);
};
Может быть, мы можем использовать один аргумент шаблона для обоих?
template<class U>
void A<U>::foo(U u)
{
return;
}
error: out-of-line definition of 'foo' does not match any declaration in 'A<T>'
Нет, мы не можем.Ну, может, так?
template<class U>
void A<U>::foo<U>(U u)
{
return;
}
error: cannot specialize a member of an unspecialized template
Нет.И это?
template<class U, class V>
void A<U>::foo(V u)
{
return;
}
error: too many template parameters in template redeclaration
Как насчет использования по умолчанию для эмуляции соответствия?
template<class U>
template<class V = U>
void A<U>::foo(V u)
{
return;
}
error: cannot add a default template argument to the definition of a member of a class template
Понятнокомпилятор беспокоится о соответствии объявления 1031 *.Это связано с тем, что компилятор сопоставляет определения шаблонов не с конкретными вызовами (как можно было бы использовать для функционального языка), а с объявлением шаблона.(Код пока здесь ).
Итак, на базовом уровне ответ «потому что определение шаблона должно соответствовать объявлению шаблона».Это все еще оставляет открытым вопрос "почему мы не можем просто пропустить параметры шаблона класса тогда?"(насколько я могу судить, не может быть никакой двусмысленности для шаблона, поэтому повторение параметров шаблона не помогает), хотя ...