クラステンプレート内でのfriend指定についての質問ですが
template <class T>
class X {
public:
friend T;
friend T f();
};
後者のフリー関数 f へのfriend指定ではコンパイル時に警告が出ます。一般的には
template <class U> friend U f();
と別のテンプレートパラメータを使うらしいですが、これだと f をTに制限できないんじゃないでしょうか?