>>49
確かに前方宣言でこのoperatorに関してはコンパイルが通りました。
ところが同じ関数名で引数が異なる関数の宣言部分

template< typename X > class Matrix{
public:
Matrix<X> func(void);
friend Matrix<X> func<X>( Matrix<X> &);
};

のフレンドの funcでエラーが出ます。前方参照を使っても駄目なようです。
gccは全く問題なく通るのですが、これらの余計な前方参照を要するのは
VC7.1のバグなのでしょうか?