あの、初歩的なことかもしれませんが、
テンプレートクラスを引数に取るテンプレート関数を、そのテンプレートクラスの中でfriend指定する方法で、
(ややこしい...)試行錯誤の結果以下のようにすればコンパイラが満足することが判りました。

template<typename T>
class Foo {
 template<typename _T, typename U>    // _Tはテンプレート引数の二重宣言エラーを防ぐため
 friend void func(const Foo<_T> &, const U &);
};

template<typename T, typename U>
void func(const Foo<T> &f, const U &u) { ... }

これは正しい書き方なのでしょうか?動いているから正しいのかもしれませんが、
friendして欲しいテンプレートクラス「のみ」引数に取る場合のオーソドックスなやり方...

template<typename T>
class Foo {
 friend void func<T>(const Foo &);
};

template<typename T>
void func(const Foo<T> &f) { ... }

とあまりに見た目が違うので違和感を覚えます。
なおgcc3でコードは通っています。