templateクラスのfriend指定は前方参照が必要
通常は、クラスのfriend指定時に、フレンドクラスの実体が存在する必要はない。
class A { friend class B; // OK }; class B {};
templateクラスをfriend指定する場合は前方宣言をしないとコンパイルエラーになる。
class A { friend class B<int>; // Explicit specialization of non-template class 'B' }; template <class T> class B {}; // Redefinition of 'B' as different kind of symbol
template <class T> class B; class A { friend class B<int>; // OK }; template <class T> class B {}; // OK