Код: Выделить всё
#include
#include
template
struct a {
template
using f = T0;
};
template
struct b {
template
using f = typename a::template f;
};
static_assert(std::same_as);
int main() {
}
< /code>
ошибка: < /p>
:13:41: error: pack expansion used as argument for non-pack parameter of alias template
13 | using f = typename a::template f;
| ^~~~~
:12:5: note: in instantiation of template type alias 'f' requested here
12 | template
| ^
:16:28: note: in instantiation of template class 'b' requested here
16 | static_assert(std::same_as);
| ^
:6:17: note: template parameter is declared here
6 | template
| ^
Если я изменю экстремацию , чтобы быть зависимым на ts ... , затем он компилируется чисто:
Код: Выделить всё
template
struct b {
template
using f = typename a::template f;
};
Каковы соответствующие правила, которые регулируют это различие? Другими словами, почему версия, в которой специализация зависит от TS хорошо сформирована, но версия, в которой она не является плохо сформирована?
< hr />
Вот более простой способ воспроизведения: < /p>
template
using type1 = T;
template
using type2 = type1;
< /code>
live < /p>
Ошибка: аргумент расширения упаковки для параметра без пакета 't' шаблона псевдонима 'шаблон с использованием type1 = t '
с использованием type2 = type1 ; < /p>
< /blockquote>
NB, как показано в Компилятор Explorer, проблема, по -видимому, является первым шаблоном, который является псевдонимом, как и в случае с простым классом, такой проблемы нет.
Подробнее здесь: https://stackoverflow.com/questions/794 ... k-paramete