可能重复:
Confusing Template error
我有一个带有模板化方法的模板化类。 现在我有另一个函数,有2个模板参数创建带有第一个模板参数的类,并用第二个函数调用函数。 考虑这个例子:
template<class S>
class A {
public:
template<class T>
T f1() {
return (T)0.0;
}
};
template<class T,class CT>
void function() {
A<T> a;
a.f1<CT>(); // gcc error in this line
}
gcc告诉我:
error: expected primary-expression before ‘>’ toke
在上面标出的行中。为什么这不起作用,我该如何解决? 谢谢! 森
答案 0 :(得分:10)
A<T>
是依赖类型(即它取决于模板参数T
),因此您必须指定您指的是模板成员:< / p>
a.template f1<CT>();
答案 1 :(得分:5)
你可以,但你需要帮助编译器。
因为a
具有依赖类型,所以编译器不能假设a.f1
引用的内容。它可以是一个类型,一个常量,一个函数......无论如何。
由于模板语法使用<
,因此很容易与operator<
混淆。
因此,标准要求您消除依赖类型中元素的性质。这适用于:
typename
,例如typedef typename A<T>::SomeType type;
template
,例如a.template f1<CT>();
可以说,由于已知CT
是一种类型,这种消歧是没有意义的,但当涉及将函数作为类型参数传递时,事情会变得毛茸茸。
例如,a.f1<CT()>();
可以解释为:
a.f1
CT
和默认构建的operator<
a.f1
作为模板参数CT()
C ++语法是(一次)统一,并且在所有情况下都需要消除歧义。
质量编译器会在您理解构造时向您建议适当的修复。