When an ambiguous match is found in the symbol table, check function signatures to disambiguate:
module class_type1. This will be language-specific but the mechanisms for doing so can be built-in at the core block level. Maybe. I think.
...
template<class T1, class T2>
function bar(type1, arg1, arg2, arg3)
...
module class_type2
...
template<class T1, class T2>
function bar(type2, arg1, arg2, arg3)
...