Overload Resolution with Function Templates
How does overload resolution work when there are both function templates and non-template functions?
When there are both function templates and non-template functions available, the compiler uses a specific set of rules to determine which one to call. Here's how it works:
- The compiler first tries to find an exact match with a non-template function. If it finds one, it calls that function.
- If there's no exact match with a non-template function, the compiler then tries to find an exact match with a function template. If it finds one, it calls that function.
- If there's no exact match with either a non-template function or a function template, the compiler then looks for a non-template function that can be called with implicit conversions.
- If there's no non-template function that can be called with implicit conversions, the compiler then looks for a function template that can be called with implicit conversions.
Here's an example:
#include <iostream>
void Print(int x) {
std::cout << "Non-template function\n";
}
template <typename T>
void Print(T x) {
std::cout << "Function template\n";
}
int main() {
Print(10);// calls non-template function
Print(10.0);// calls function template
}
Non-template function
Function template
In the first call Print(10)
, the non-template function Print(int)
is an exact match, so it's called.
In the second call Print(10.0)
, there's no exact match with a non-template function. However, the function template Print(T)
can be instantiated with T
deduced as double
to create an exact match, so that's what's called.
Understanding Overload Resolution
Learn how the compiler decides which function to call based on the arguments we provide.