フォーラムには、フレンドとテンプレートに関する多くのスレッドがあります。私はここでこれを特別にチェックしました:http: //www.parashift.com/c++-faq-lite/templates.html#faq-35.16
しかし、ここで1つの段落について少し混乱しています:
この障害は、コンパイラがクラス定義でフレンドの行が適切に並んでいることを確認したときに発生します。その時点では、フレンド関数自体がテンプレートであるかどうかはまだわかりません。これらは次のような非テンプレートであると想定しています。
Foo<int> operator+ (const Foo<int>& lhs, const Foo<int>& rhs)
{ ... }
std::ostream& operator<< (std::ostream& o, const Foo<int>& x)
{ ... }
私はコンパイラ技術についてあまり知らないことを告白しなければなりません。ここで私が混乱しているのは、このようなクラス内のステートメントが、関数operator+がテンプレート関数であると言うのに十分ではない理由です。
friend Foo<T> operator+ (const Foo<T>& lhs, const Foo<T>& rhs);
テンプレートパラメータTと三角括弧があります...テンプレート関数以外に他にどのようなタイプがあり得るかを考えようとしています。しかし、それを通して私の心を得ることができません。
私はまた、コンパイラが作る仮定についても混乱しています。なぜそれは特定の型<int>を選んだのですか?なぜコンパイルはこの仮定をしますが、テンプレート関数はしません-これは私にとってより合理的なようです。
どうもありがとう、
チェン