Как уже отмечалось, вы можете использовать существующее определение Foo и использовать шаблонную функцию foo.
Если вы действительно хотите использовать общий тип для всех экземпляров вашего шаблона Foo, вы должны добавить его как Базовый класс Foo.
class FooBase {...};
template<int v>
class Foo : public FooBase {...};
Затем вы можете написать функцию foo, которая принимает указатель или ссылку на базовый класс. Но это имеет смысл, только если вы добавите в базовый класс виртуальную функцию, которую вы переопределите в шаблонном классе Foo:
#include<iostream>
class FooBase {
public:
virtual int doubleIt() const = 0;
};
template<int v>
class Foo : public FooBase {
public:
int doubleIt() const {return 2*v;}
};
void foo(FooBase* x) {
int d = x->doubleIt();
std::cout << "x->double() is " << d << std::endl;
// do stuff with d
}
int main() {
Foo<2> a;
foo(&a);
Foo<3> b;
foo(&b);
}
Демонстрационный код