テンプレートクラスの、フレンド関数定義

今日のお題はテンプレートクラスの、フレンド関数定義だ。テンプレートクラスのフレンド関数定義をするにあたって一番簡単なのは、クラス定義の中に実装を書いてしまうことだ。これなら何も問題はない。ヘッダに全てを書くことが推奨されそうなこれからの時代はこれが一番かっこいいと思う。


// クラス定義
template< class T > class Vec3{
 friend ostream& operator<<(ostream& os, const Vec3& v){
 // 実装定義
 };
};

ところが実装定義をクラス定義の外に出したい場合は、注意が必要だ。実装の記述をクラス外部に出したい場合は、


// クラス定義内部
 friend ostream& operator<<(ostream& os, const Vec3& v);
// 実装定義
template < class T > ostream& operator<<(ostream& os, const Vec3& v){
}

のように、クラス定義部では、フレンド関数名の後ろに、をつけることが必要なようである。これはVisualC++2005の話だが。
●本日の教訓:不動小数点数における==判定はやめられよとの記事ありがたい。