1

フォーラムには、フレンドとテンプレートに関する多くのスレッドがあります。私はここでこれを特別にチェックしました: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>を選んだのですか?なぜコンパイルはこの仮定をしますが、テンプレート関数はしません-これは私にとってより合理的なようです。

どうもありがとう、

チェン

4

1 に答える 1

1

テンプレート(前に宣言された)であるクラスでフレンド関数を宣言するときはいつでも、空の山かっこを配置するか、たとえば次のように修飾することによって、宣言された関数がテンプレートであることをコンパイラに通知する必要があります。

http://ideone.com/kmIfc

そうしないと、以前に宣言された非テンプレート関数がない場合、宣言されたフレンド関数は新しい関数の宣言と見なされます。

http://ideone.com/woIgn

于 2012-06-07T21:49:16.180 に答える