Szukaj…


Uwagi

  • Normalna funkcja nigdy nie jest powiązana z szablonem funkcji, pomimo tej samej nazwy i tego samego typu.
  • Normalne wywołanie funkcji i wygenerowane wywołanie szablonu funkcji są różne, nawet jeśli mają tę samą nazwę, ten sam typ zwrotu i tę samą listę argumentów

Co to jest przeciążenie prawidłowego szablonu funkcji?

Szablon funkcji może zostać przeciążony zgodnie z zasadami przeciążania funkcji innych niż szablon (ta sama nazwa, ale różne typy parametrów), a ponadto przeciążenie jest ważne, jeśli

  • Typ zwrotu jest inny lub
  • Lista parametrów szablonu jest inna, z wyjątkiem nazewnictwa parametrów i obecności domyślnych argumentów (nie są one częścią podpisu)

W przypadku normalnej funkcji porównywanie dwóch typów parametrów jest łatwe dla kompilatora, ponieważ ma wszystkie informacje. Ale typ w szablonie może jeszcze nie zostać określony. Dlatego reguła, w której dwa typy parametrów są równe, jest tutaj przybliżona i mówi, że typy i wartości niezależne muszą się zgadzać, a pisownia typów zależnych i wyrażeń musi być taka sama (dokładniej, muszą one być zgodne z tak zwane reguły ODR), z tym wyjątkiem, że można zmienić nazwę parametrów szablonu. Jeśli jednak w przypadku tak różnych pisowni dwie wartości w ramach typów są uważane za różne, ale zawsze wystąpią takie same wartości, przeciążenie jest nieprawidłowe, ale kompilator nie wymaga diagnostyki.

template<typename T>
void f(T*) { }

template<typename T>
void f(T) { }

Jest to ważne przeciążenie, ponieważ „T” i „T *” to różne pisownia. Ale poniższe informacje są nieprawidłowe i nie wymagają diagnostyki

template<typename T>
void f(T (*x)[sizeof(T) + sizeof(T)]) { }

template<typename T>
void f(T (*x)[2 * sizeof(T)]) { }


Modified text is an extract of the original Stack Overflow Documentation
Licencjonowany na podstawie CC BY-SA 3.0
Nie związany z Stack Overflow