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