1
template<class T> struct A { A(){}; };
2
template<class T,class S> struct B { B(){}; };
3
template<class T> void f(T, char = 1) {}
4
template<class T> void f(T*, long = 2) {}
5
template<class T> void f(const T*, short = 3) {}
6
template<class T> void g(T) {}
7
template<class T> void g(T&) {}
8
template<class T> void h(const T&) {}
9
template<class T> void h(A<T>&) {}
10
template<class T> void l(B<T,T>&) {}
11
template<class T> void l(B<T,int>&) {}
15
f(p); // f(const T*) is more specialized than f(T) or f(T*)
18
g(x); // Ambiguous: g(T) or g(T&)
21
h(z); // overload resolution selects h(A<T>&)
24
h(z2); // h(const T&) is called because h(A<T>&) is not callable
27
l(z3); // Ambiguous: l(B<T,int>) or l(B<T,T>)