What is the reason for prohibiting recursion in aliases if you can simply replace it with a more detailed construction?
You seem to have answered your question. You have a mechanism to do what you want. And since a pseudonym by definition is intended only for shorthand, why complicate languages that were already complex grammar?
You use a structure to implement the machine and an alias to give a nice type name:
template<typename T, int N>
using vec = typename foo<T,N>::vec;
, .