为什么下面的代码无效?
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);
}
C++ 不知道这一点(此时),因为f
' 的类型取决于模板参数的类型T
。此外,以下语法将是模棱两可的:是<
指模板列表的开头还是小于运算符?为了帮助 C++ 弄清楚,您需要指定这f
是一个模板,否则 C++ 无法解析以下部分,因为解析本身取决于T
.
您还可以依靠类型推断来推断模板类型,而不是显式声明它。然后你会得到“tf(s);”,这实际上是一种更通用的方式来表示它:你可能不关心 f 是一个模板函数,你只是希望它有一些接受一个 f 的定义S。