Understanding Overload Resolution

Overload Resolution with Function Templates

How does overload resolution work when there are both function templates and non-template functions?

Illustration representing computer hardware

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:

  1. The compiler first tries to find an exact match with a non-template function. If it finds one, it calls that function.
  2. 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.
  3. 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.
  4. 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.

Answers to questions are automatically generated and may not have been reviewed.

Free, Unlimited Access

Professional C++

Comprehensive course covering advanced concepts, and how to use them on large-scale projects.

Screenshot from Warhammer: Total War
Screenshot from Tomb Raider
Screenshot from Jedi: Fallen Order
Contact|Privacy Policy|Terms of Use
Copyright © 2024 - All Rights Reserved