2

次のコードが無効なのはなぜですか?

template <typename S, typename T>
struct B{
    void f(T t, S s) {t.f<S>(s); }
};

gcc 4.3.4は、「'>'トークンの前にプライマリ式が必要です」、つまり「S」が有効なプライマリ式ではなかったと文句を言います。

4

2 に答える 2

12

fテンプレートであることを指定する必要があります。

void f(T t, S s) {
    t.template f<S>(s);
}

fの型はテンプレートパラメータの型に依存するため、C ++は(この時点で)これを認識しませんT。さらに、次の構文はあいまいになります。<テンプレートリストの開始を意味するのでしょうか、それとも小なり演算子を意味するのでしょうか。fC ++がそれをテンプレートとして指定する必要があることを理解しやすくするために、そうでない場合、解析自体がのタイプに依存するため、C++は次の部分を解析できませんT

于 2010-06-10T15:44:02.900 に答える
1

テンプレートの型を明示的に示すのではなく、型の推論に基づいて推論することもできます。次に、「tf(s);」があります。これは、実際にはもう少し一般的な方法です。おそらく、fがテンプレート化された関数であることを気にせず、fを受け入れるfの定義を設定するだけです。 S。

于 2010-06-10T20:26:33.773 に答える