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);
}

C++ 不知道这一点(此时),因为f' 的类型取决于模板参数的类型T。此外,以下语法将是模棱两可的:是<指模板列表的开头还是小于运算符?为了帮助 C++ 弄清楚,您需要指定这f是一个模板,否则 C++ 无法解析以下部分,因为解析本身取决于T.

于 2010-06-10T15:44:02.900 回答
1

您还可以依靠类型推断来推断模板类型,而不是显式声明它。然后你会得到“tf(s);”,这实际上是一种更通用的方式来表示它:你可能不关心 f 是一个模板函数,你只是希望它有一些接受一个 f 的定义S。

于 2010-06-10T20:26:33.773 回答