Ответ 1
Это ожидаемое поведение; в отличие от вывод аргумента шаблона (для шаблонов функций), вывод шаблона шаблона класса (поскольку С++ 17) работает только тогда, когда аргументы шаблона не предоставляются.
Вывод аргумента шаблона шаблона выполняется только в том случае, если нет шаблона аргументы. Если указан хотя бы один аргумент, вычет не состоится.
std::tuple t(1, 2, 3); // OK: deduction std::tuple<int,int,int> t(1, 2, 3); // OK: all arguments are provided std::tuple<int> t(1, 2, 3); // Error: partial deduction
Это означает, что для вашего примера вы не можете использовать вывод аргумента шаблона шаблона и должны указывать все аргументы шаблона. Если вы хотите, чтобы аргумент аргумента шаблона шаблона вступил в силу, вам необходимо указать его, но параметр шаблона T1
не может быть выведен.
С другой стороны, будет работать следующий код.
template <typename T1, typename T2>
struct Bar {
Bar(T1, T2) {} // make it possible to deduce T1
};
int main(int argc, char **argv) {
Bar bar(42, 42); // take advantage of class template argument deduction
}