friend宣言の仕方が分からない。

VC、GCCの両者が受け付けるfriend宣言の仕方が分からない(T_T)

template <class S, class T, template <class> class U>
class baz
{
  friend class U<S>::template bar<T>;      // <== GCCはこれを受け付けてくれない。
  template <class> friend class U<S>::bar; // こうするとVCが受け付けてくれない。

};

template <class S>
struct foo
{
  template <class T>
  class bar{};
};

int main()
{
  baz<int, int,foo> a;
  return 0;
}

面倒くさくなったので、すべてpublicにしてやる。