テンプレートクラスのプライベートなメンバを <<演算子 で出力可能にするため↓

#include <iostream>

template < class T >
class test
{
friend std::ostream& operator<< ( std::ostream& os, test< T > t );
public:
void set( T val ) { x = val; }
private:
T x;
};

template < class T >
std::ostream& operator<< ( std::ostream& os, test< T > t )
{
os << t.x;
return os;
}

↑のようにfriend宣言したとき、

int main()
{
test< int > t;
t.set( 5 );
cout << t << endl;
}

とするとエラーが出るのですがなぜでしょう・・・。orz
テンプレートクラスでなければ問題なく動くのですが・・・。