Can I use template aliases as template template parameters?

Yes, it is apparently allowed. According to the latest draft of the upcoming standard I could find, it is stated that A template-argument for a template template-parameter shall be the name of a class template or an alias template […]. However, alias templates seems very seldomly supported at the moment, so you might have some … Read more

Why does alias template give a conflicting declaration?

The problem relies on SFINAE. If you rewrite your member function to be value_t<S<T>>, like the outside declaration, then GCC will happily compile it: template<class T> struct S { using value_type = int; static const value_t<S<T>> C = 0; }; template<class T> const value_t<S<T>> S<T>::C; Because the expression is now functionally equivalent. Things like substitution … Read more