Да. Это действительно.
Вы можете вызывать эту функцию с любым шаблоном класса, который принимает точно один параметр шаблона. Например,
template<typename T>
struct A
{
//...
};
foo< A >(); //ok
Обратите внимание, что вам не нужно указывать аргумент шаблона для A
шаблона класса, что означает, что следующее может привести к ошибке компиляции:
foo< A<int> >(); //error
Кроме того, в вашем коде T2
является необязательным, и фактически вы не можете использовать его в функции, поэтому лучше удалите его, чтобы упростить определение:
template < template <typename> class T>
void foo() {
T<int> x; //this is how T can be instantiated; provide template argument!
}
Демо: http://ideone.com/8jlI5