Rozpoznawanie przeciążenia wywołań szablonów funkcji

Szablon funkcji może przeciążać funkcje inne niż szablony o tej samej nazwie. W tym scenariuszu kompilator najpierw próbuje rozwiązać wywołanie funkcji przy użyciu odliczenia argumentu szablonu w celu utworzenia wystąpienia szablonu funkcji z unikatową specjalizacją. Jeśli odliczenie argumentu szablonu zakończy się niepowodzeniem, kompilator uwzględnia przeciążenia szablonu funkcji utworzonej przez wystąpienie i przeciążenia funkcji nienależące do szablonu w celu rozwiązania wywołania. Te inne przeciążenia są nazywane zestawem kandydatów. Jeśli odliczenie argumentu szablonu powiedzie się, wygenerowana funkcja jest porównywana z innymi funkcjami w zestawie kandydatów w celu określenia najlepszego dopasowania, zgodnie z regułami rozpoznawania przeciążeń. Aby uzyskać więcej informacji, zobacz Przeciążanie funkcji.

Przykład: wybieranie funkcji innej niż szablon

Jeśli funkcja inna niż szablon jest równie dobrym dopasowaniem do szablonu funkcji, zostanie wybrana funkcja inna niż szablon (chyba że argumenty szablonu zostały jawnie określone), tak jak w wywołaniu f(1, 1) w poniższym przykładzie.

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

Przykład: preferowany szablon funkcji dokładnego dopasowania

W następnym przykładzie pokazano, że preferowany jest dokładnie pasujący szablon funkcji, jeśli funkcja nienależąca do szablonu wymaga konwersji.

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

Zobacz też

Rozpoznawanie nazw
typename