template <typename T> T Foo(T*, int); // A
template <typename T> T Foo(T, T); // B
template <> char Foo(char *, int); // C
double Foo(double, double); // D
int main(void)
{
int i;
unsigned int ui;
char str[20];
int ia[20];
Foo(str, 20); // 1
Foo(ia, 20); // 2
Foo(ia[0], i); // 3
Foo(i, ui); // 4
Foo(ia, ui); // 5
Foo(&i, i); // 6
return 0;
}