メンバー関数テンプレート
用語のメンバー テンプレートはメンバー関数テンプレートと入れ子になったクラス テンプレートを示します。メンバー関数テンプレートはクラスまたはクラス テンプレートのメンバーのテンプレート関数です。詳細については入れ子になったクラス テンプレート を参照してください。
このメンバー関数は複数のコンテキストの関数テンプレートです。クラス テンプレートのすべての関数が一般的ですがメンバーのテンプレート クラスまたはメンバー関数テンプレートと言われません。これらのメンバー関数が独自のテンプレート引数を受け取る場合はメンバー関数テンプレートと見なされます。詳細についてはテンプレート クラスのメンバー関数 を参照してください。
使用例
非テンプレート メンバー関数テンプレートまたはテンプレート クラスはテンプレート パラメーターの関数テンプレートとして宣言されています。
// member_function_templates.cpp
struct X
{
template <class T> void mf(T* t) {}
};
int main()
{
int i;
X* x = new X();
x->mf(&i);
}
次の例はテンプレート クラスのメンバー関数テンプレートを示します。
// member_function_templates2.cpp
template<typename T>
class X
{
public:
template<typename U>
void mf(const U &u)
{
}
};
int main()
{
}
またVisual Studio .NET 2003 以降ではメンバーのテンプレートはクラスの外部で定義できます。
// 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()
{
}
ローカル クラスはメンバー テンプレートを使用できません。
メンバーのテンプレート関数は基本クラスの仮想関数と同じ名前で宣言されている仮想関数で基本クラスの仮想関数をオーバーライドできません。
テンプレート宣言されたユーザー定義変換の Visual C++ .NET 2003 で導入されたのサポート。次の例では標準で指定されたVisual C++ .NET 2003 以降で動作します。
// 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>.
}