Ответ 1
Обе формы действительны. Когда имя шаблона класса используется внутри рамки шаблона класса без аргументов шаблона, оно разрешает имя "текущей" специализации шаблона.
a
и b
имеют a
и тот же тип.
Это то же правило, что позволяет нам писать, например:
template<typename T>
Foo<T>::Foo(Foo const&) = default;
... вместо более подробных:
template<typename T>
Foo<T>::Foo(Foo<T> const&) = default;