クラステンプレートの内側にあるクラステンプレートの定義をクラススコープの外で行う

クラステンプレートの中に入れ子でクラステンプレートを宣言して,クラススコープの外から内側のクラステンプレートの定義を書く書き方.関数テンプレートについても同様.

template<typename T1>
class C1
{
  template<typename T2>
  class C2;

  template<typename T2>
  void f(T2 arg);
};

template<typename T1>
template<typename T2>
class C1<T1>::C2
{
// C2の定義
};

template<typename T1>
template<typename T2>
void C1<T1>::f(T2 arg)
{
  // fの定義
}

ただし,この記法に対応していないコンパイラも多いです.