Here’s a simple fix:
template <typename T, typename U>
void overlap(T t, U u)
{
void overlap(U, T);
overlap(u, t);
}
The template itself declares the target function, which will be preferred over recursion because it is an exact match (be sure to take care of constness and reference-ness in your real case). If the function has not been implemented, you get a linker error:
/tmp/cc7zinK8.o: In function `void overlap<C, D>(C, D)':
main.cpp:(.text._Z7overlapI1C1DEvT_T0_[_Z7overlapI1C1DEvT_T0_]+0x20):
undefined reference to `overlap(D, C)'
collect2: error: ld returned 1 exit status
… which points directly at the missing function 🙂