Кажется, что аргумент пакета может быть только вместо параметра пакета шаблона псевдонима. Это не верно для класса или шаблона функции:Расширение пакета для шаблона псевдонима
template <class T, class... Args> struct x { using type = T; };
template <class T, class... Args> using x_t = typename x<T, Args...>::type;
template <class... Args> using x_fix_t = typename x<Args...>::type;
template <class... Args> auto f(Args...) -> void {
typename x<Args...>::type v1; // OK
x_t<Args...> v2; // Error
x_fix_t<Args...> v3; // OK
}
простой случай:
template <class T, class U> using y_t = T;
template <class... Args> auto f(Args...) -> void {
y_t<Args...> v4; // Error
}
Приведенный выше код генерирует ошибку (даже если f
никогда не инстанцированный) как с c++11
и c++14
в g++ 4.9
, g++ 5.1
и clang 3.5
.
Почему это не разрешено и каково общее правило? Я не вижу причин ограничивать это. Это кажется очень странным запретом.
Что касается того, почему не писать как x_fix_t
с первым вариантом, более ясно, что x_t
имеет обязательный первый аргумент. (например, именно поэтому f()
не допускается). Но это не так важно, исправление легко. Остается вопрос: почему?
НКУ ошибка:
error: pack expansion argument for non-pack parameter ‘T’ of
alias template ‘template<class T, class ... Args> using x_t = typename x::type’
лязг ошибка:
error: pack expansion used as argument for non-pack parameter of
alias template x_t<Args...> v2;
Информация здесь актуальна, я думаю: http://stackoverflow.com/q/24433658/4326278 – bogdan
Кроме того, для того, что стоит, MSVC 12 и 14 RC скомпилируют это без каких-либо диагностических функций (кроме обычных предупреждений о непривязанных переменные) - «дисперсия реализации», как говорится. – bogdan
Работает нормально в g ++ 4.8.2. –