まず、Matrixクラスを前方宣言します。これにより、IteratorクラスはMatrixクラスの名前を確認し、それへのポインターと参照を作成できます。(Iteratorクラスがまだメンバーデータにアクセスしたり、メンバー関数を呼び出したりすることはできません。)
template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix;
次に、Iteratorクラスを定義します。この時点でできることは、マトリックスへの参照とポインターを保持することだけです。(Matrixのメンバーにはまだアクセスできません。)
template<typename T, typename Size>
class Iterator{
// don't define any function bodies in here
//but do put all data members and prototypes in here
};
次に、Matrixクラス(Iteratorメンバーにアクセスできる)を定義します
template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix{
// don't define any function bodies in here
//but do put all data members and prototypes in here
};
次に、各クラスのメソッド本体を定義します。この時点で、両方のクラスのメソッドが互いのメンバーにアクセスできます。通常、この部分は.cppファイルに含まれますが、テンプレートの場合は.hファイルに含まれます。
template<typename T, typename Size, typename Stack, typename Sparse>
Matrix<T,Size,Stack,Sparse>::Matrix(){ /*...*/}
template<typename T, typename Size>
Iterator<T,Size>::Iterator(){ /*...*/ }