次のコードが無効なのはなぜですか?
template <typename S, typename T>
struct B{
void f(T t, S s) {t.f<S>(s); }
};
gcc 4.3.4は、「'>'トークンの前にプライマリ式が必要です」、つまり「S」が有効なプライマリ式ではなかったと文句を言います。
次のコードが無効なのはなぜですか?
template <typename S, typename T>
struct B{
void f(T t, S s) {t.f<S>(s); }
};
gcc 4.3.4は、「'>'トークンの前にプライマリ式が必要です」、つまり「S」が有効なプライマリ式ではなかったと文句を言います。
f
テンプレートであることを指定する必要があります。
void f(T t, S s) {
t.template f<S>(s);
}
f
の型はテンプレートパラメータの型に依存するため、C ++は(この時点で)これを認識しませんT
。さらに、次の構文はあいまいになります。<
テンプレートリストの開始を意味するのでしょうか、それとも小なり演算子を意味するのでしょうか。f
C ++がそれをテンプレートとして指定する必要があることを理解しやすくするために、そうでない場合、解析自体がのタイプに依存するため、C++は次の部分を解析できませんT
。
テンプレートの型を明示的に示すのではなく、型の推論に基づいて推論することもできます。次に、「tf(s);」があります。これは、実際にはもう少し一般的な方法です。おそらく、fがテンプレート化された関数であることを気にせず、fを受け入れるfの定義を設定するだけです。 S。