template <class T> void foo(T){}
template <class T> struct bar{};
template <class T> void foo(bar<T>){}

int main(){
bar<int> b;
foo(b);
}

以上のプログラムがコンパイル通りません。
そこで以下のようにしたら無事とおりました。下のプログラムはC++的に正しいですか?

template <class T> void foo(T){}
template <class T> struct bar{
friend void foo(bar<T>){}
};

int main(){
bar<int> b;
foo(b);
}