При выводе аргумента шаблона все, что находится слева от оператора разрешения области действия ::
в аргументе шаблона частичной специализации, представляет собой не выводимый контекст , означающий, что параметр шаблона, появляющийся там не будет выведен из соответствующего аргумента специализации.
Кроме того, если часть квалифицированного имени типа является не выводимым контекстом, то все параметры, используемые для указания типа, не выводятся.
Таким образом, в вашем примере ни D
, ни E
не выводятся из typename Outer<D>::template Inner<E>
, и, поскольку нет другого способа вывести их, вывод не выполняется, что означает, что частичная специализация никогда не бывает жизнеспособной.