Рассмотрим код:
#include <iostream>
template <class... Ts>
struct outer {
template <class... ITs>
struct inner {
static constexpr bool value = false;
};
template <class... ITs>
struct inner<Ts..., ITs...> {
static constexpr bool value = true;
};
};
int main() {
std::cout << outer<int, float, double>::inner<int, float, double, int>::value << std::endl;
}
Код компилируется с помощью clang++, но не с g++, где он создает ошибку:
temp3.cc:11:11: ошибка: аргумент пакета параметров "Ts... должен быть на конец списка аргументов шаблона
struct inner<Ts..., ITs...> { ^
Как я уже установил здесь, частичная специализация внутреннего класса должна быть законной.
Edit: Для полноты стоит добавить, что clang для вышеуказанного кода предупреждает, что у него может возникнуть проблема с выводом параметров IT, но без проблем...