Поскольку у вас есть зависимое имя , вам нужно сказать typename
:
template <typename ...T> inline typename first_va_arg<T...>::type getFirstArgTypeDefaultValue( const T& ...values )
// ^^^^^^^^
{
typedef typename first_va_arg<T...>::type FirstArgT;
//..
}
Обратите внимание, что вам не хватает базового варианта для параметров no . Я бы, вероятно, покончил с частичной специализацией и просто объявил бы основной шаблон как:
template <typename T, typename...> struct first_va_arg { typedef T type; };
Затем, когда вы говорите first_va_arg<>::type
, вы не получаете ошибку «несуществующего имени», а потенциально более значимое «несоответствие параметров шаблона». Вам решать. В качестве альтернативы вы можете только объявить основной шаблон, но оставить его неопределенным.