使用模板参数作为模板参数

时间:2010-06-10 15:40:47

标签: c++ templates template-specialization

为什么以下代码无效?

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

gcc 4.3.4抱怨它“预期'&gt;'之前的初级表达'令牌“,即”S“不是有效的主要表达。

2 个答案:

答案 0 :(得分:12)

您需要指定f是模板:

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

C ++不知道这一点(此时),因为f的类型取决于模板参数T的类型。此外,以下语法不明确:<是指模板列表的开头还是小于运算符?为了帮助C ++解决这个问题,您需要指定f是一个模板,否则C ++无法解析以下部分,因为解析自身取决于T的类型。 / p>

答案 1 :(得分:1)

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