Вы можете вызвать эту функцию с любым шаблоном класса, который принимает ровно один параметр шаблона. Например,
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!
}