メンバー関数テンプレート

用語メンバー テンプレートは、メンバー関数テンプレートと入れ子になったクラス テンプレートを示します。 メンバー関数テンプレートは、クラスまたはクラス テンプレートのメンバーである関数テンプレートです。

メンバー関数は複数のコンテキストの関数テンプレートになります。 クラス テンプレートのすべての関数はジェネリックですが、メンバー テンプレートまたはメンバー関数テンプレートと呼ばれることはありません。 これらのメンバー関数が独自のテンプレート引数を受け取る場合、それらはメンバー関数テンプレートと見なされます。

例: メンバー関数テンプレートを宣言する

非テンプレート クラスまたはクラス テンプレートのメンバー関数テンプレートは、テンプレート パラメーターを持つ関数テンプレートとして宣言されます。

// 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()
{
}

例: クラスの外部でメンバー テンプレートを定義する

// 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()
{
}

例: テンプレート化されたユーザー定義変換

ローカル クラスにメンバー テンプレートを含めることはできません。

メンバー関数テンプレートを仮想関数にすることはできません。 また、基底クラスの仮想関数と同じ名前で宣言されている場合、基底クラスの仮想関数をオーバーライドすることはできません。

次の例は、テンプレート化されたユーザー定義変換を示しています。

// 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>.
}

関連項目

関数テンプレート