Szablony funkcji członkowskich
Termin szablon członkowski odnosi się zarówno do szablonów funkcji członkowskich jak i szablonów zagnieżdżonych klas.Szablony funkcji członkowskich są funkcjami szablonu, które są członkami klasy lub szablonem klasy.Aby uzyskać więcej informacji, zobacz Zagnieżdżone szablony klas.
Funkcje składowe mogą być funkcjami szablonów w kilku sytuacjach.Wszystkie funkcje szablonów klas są generyczne, ale nie są określane jako szablony członkowskie lub szablony funkcji członkowskich.Jeśli te funkcje składowe używają własnych argumentów szablonu, są one uważane za szablony funkcji członkowskich.Aby uzyskać szczegółowe informacje, zobacz Funkcje członkowskie szablonu klasy.
Przykład
Szablony funkcji członkowskich klas bez szablonu lub szablonu są zadeklarowane jako szablony funkcji z ich parametrami szablonu.
// member_function_templates.cpp
struct X
{
template <class T> void mf(T* t) {}
};
int main()
{
int i;
X* x = new X();
x->mf(&i);
}
W poniższym przykładzie pokazano szablon funkcji członkowskiej szablonu klasy.
// member_function_templates2.cpp
template<typename T>
class X
{
public:
template<typename U>
void mf(const U &u)
{
}
};
int main()
{
}
Dodatkowo, w programie Visual Studio .NET 2003 i w nowszych członek szablonów może być także zdefiniowany poza klasą.
// defining_member_templates_outside_class.cpp
template<typename T>
class X
{
public:
template<typename U>
void mf(const U &u);
};
template<typename T> template <typename U>
void X<T>::mf(const U &u)
{
}
int main()
{
}
Lokalne klasy nie mogą mieć szablonów elementów członkowskich.
Funkcje składowe szablonu nie mogą być funkcjami wirtualnymi i nie można zamienić funkcji wirtualnych z klasy bazowej, kiedy są deklarowane z taką samą nazwę jak funkcja wirtualna klasy podstawowej.
W programie Visual C++ .NET 2003 wprowadzono dla szablonów obsługę konwersji zdefiniowanych przez użytkownika.Poniższy przykład działa w Visual C++ .NET 2003, jak określono w normie.
// templated_user_defined_conversions.cpp
template <class T>
struct S
{
template <class U> operator S<U>()
{
return S<U>();
}
};
int main()
{
S<int> s1;
S<long> s2 = s1; // Convert s1 using UDC and copy constructs S<long>.
}