Slajd PPT
Do argumentów funkcji wzorca nie stosuje się żadnych domyślnych konwersji
Funkcja wzorca może być przeciążona przez inne funkcje o tej samej nazwie, albo przez inne funkcje wzorca o tej samej nazwie. Rozróżnianie jest wykonywane w następujący sposób:
1. Szukaj dokładnie pasującej funkcji
2. Szukaj wzorca pozwalającego na wygenerowanie dokładnie pasującej funkcji
3. Spróbuj zwykłego rozróżniania przeciążonych funkcji
template <class T> T max(T a, T b) {return a>b ? a : b;};
void f (int a, int b, char c, char d){
int m1=max(a,b); //max(int, int)
int m2 = max(c,d); //max(char, char)
int m3 = max(a,c); //max(int, char) - źle
int m4 = max(a, int(c)); //max(int, int)
int max(int,int); //taka deklaracja umożliwi skorzystanie z reguły 3 dla m3
void f (int a, int b, char c, char d){
int m1=max(a,b); //max(int,int)
int m2 = max(c,d); //max(char, char)
int m3 = max(a,c); //max(int, int)
Można oczywiście zdefiniować wzorzec z różnymi typami ale jest ot na ogół źródłem niespodziewanych wyników.
template <class T1, class T2> T1 max(T1 a, T2 b) {return a>b ? a : b;};