Рассмотрим этот минимальный пример:
template <typename T, typename U>
struct foo {};
template <template <typename...> class Bar>
struct converter
{
template <typename... Args>
converter(const Bar<Args...> &);
};
int main()
{
converter<foo> c(foo<int,double>()); // This works.
// converter<foo> c = foo<int,double>(); This fails
}
Закомментированная строка завершается с GCC 4.5 и 4.6 с сообщением типа:
main.cpp:10:2: error: wrong number of template arguments (1, should be 2)
main.cpp:4:8: error: provided for template<class T, class U> struct foo
main.cpp: In function int main():
main.cpp:15:37: error: conversion from foo<int, double> to non-scalar type converter<foo> requested
Если вместо использования шаблонов с переменными параметрами используется определенное количество параметров шаблона (то есть, в данном случае 2), ошибок нет. Я немного сбит с толку, поскольку ожидал, что две строки будут в точности эквивалентны: это ожидаемое поведение?