The problem is that you are trying to create a partial specialization that does not match the main template (the main template requires at least one argument). If you want to use a variadic template, you can instead do:
template <typename... A>
struct S {
// One-or-more case
};
template <>
struct S<> {
// Zero case
};
Based on comments, the poster wanted to find the first argument for the non-empty case; the modification for that is:
template <typename... A>
struct S;
template <>
struct S<> {
// Zero case
};
template <typename A, typename... B>
struct S<A, B...> {
// One-or-more case
};