Condividi tramite


Risoluzione dell'overload di chiamate a modelli di funzioni

Un modello di funzione può eseguire l'overload di funzioni non modello con lo stesso nome. In questo scenario, il compilatore tenta innanzitutto di risolvere una chiamata di funzione usando la deduzione dell'argomento modello per creare un'istanza del modello di funzione con una specializzazione univoca. Se la deduzione dell'argomento modello ha esito negativo, il compilatore considera gli overload del modello di funzione di cui è stata creata un'istanza e gli overload di funzioni non modello per risolvere la chiamata. Questi altri overload sono noti come set candidato. Se la deduzione dell'argomento modello ha esito positivo, la funzione generata viene confrontata con le altre funzioni nel set candidato per determinare la corrispondenza migliore, seguendo le regole per la risoluzione dell'overload. Per altre informazioni, vedere Overload delle funzioni.

Esempio: scegliere una funzione non modello

Se una funzione non modello è altrettanto valida per un modello di funzione, viene scelta la funzione non modello (a meno che non siano stati specificati in modo esplicito gli argomenti del modello), come nella chiamata f(1, 1) nell'esempio seguente.

// 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)

Esempio: Modello di funzione di corrispondenza esatta preferito

Nell'esempio seguente viene illustrato che il modello di funzione corrispondente è preferibile se la funzione non modello richiede una conversione.

// 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)

Vedi anche

Risoluzione dei nomi
typename