Resolución de sobrecarga de llamadas de plantilla de función

Una plantilla de función puede sobrecargar funciones que no son de plantilla con el mismo nombre. En este escenario, el compilador primero intenta resolver una llamada de función mediante la deducción de argumentos de plantilla para crear instancias de la plantilla de función con una especialización única. Si se produce un error en la deducción del argumento de plantilla, el compilador considera las sobrecargas de la plantilla de función con instancias y las sobrecargas de función que no son de plantilla para resolver la llamada. Estas otras sobrecargas se conocen como conjunto de candidatos. Si la deducción del argumento de plantilla se realiza correctamente, la función generada se compara con las otras funciones del candidato establecida para determinar la mejor coincidencia, siguiendo las reglas para la resolución de sobrecargas. Para obtener más información, consulte Sobrecarga de funciones.

Ejemplo: Elección de una función que no es de plantilla

Si una función que no es de plantilla es una coincidencia igual a una plantilla de función, se elige la función que no es de plantilla (a menos que se especifiquen explícitamente los argumentos de plantilla), como en la llamada f(1, 1) en el ejemplo siguiente.

// template_name_resolution9.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

void f(int, int) { cout << "f(int, int)" << endl; }
void f(char, char) { cout << "f(char, char)" << endl; }

template <class T1, class T2>
void f(T1, T2)
{
   cout << "void f(T1, T2)" << endl;
};

int main()
{
   f(1, 1);   // Equally good match; choose the non-template function.
   f('a', 1); // Chooses the function template.
   f<int, int>(2, 2);  // Template arguments explicitly specified.
}
f(int, int)
void f(T1, T2)
void f(T1, T2)

Ejemplo: Plantilla de función de coincidencia exacta preferida

En el ejemplo siguiente se muestra que se prefiere la plantilla de función que coincida exactamente si la función que no es de plantilla requiere una conversión.

// template_name_resolution10.cpp
// compile with: /EHsc
#include <iostream>
using namespace std;

void f(int, int) { cout << "f(int, int)" << endl; }

template <class T1, class T2>
void f(T1, T2)
{
   cout << "void f(T1, T2)" << endl;
};

int main()
{
   long l = 0;
   int i = 0;
   // Call the function template f(long, int) because f(int, int)
   // would require a conversion from long to int.
   f(l, i);
}
void f(T1, T2)

Consulte también

Resolución de nombres
typename