可能重复:
Where and why do I have to put “template” and “typename” on dependent names?
我有以下星座:
template<typename T>
class A{
template<typename U>
A<U> f()const;
}
template<typename T, typename U>
A<U> F(const A<T> &I)
{
return I.f<U>();//this does not work
}
标记行上的编译器错误是:
error: expected initializer before ‘>’ token
那么我该如何正确地写行?
答案 0 :(得分:6)
这是你的两阶段查找。这样做:
I.template f<U>();
这是必要的,因为当编译器编译函数模板F()
时,它不知道它可能被实例化的T
。 <{1}}的定义后,A
可以是专门的,只有在实际实例化F()
时才会知道。因此,当编译器遇到其定义时,F()
也可以是I.f<U
成员f
与某些A<T>
之间的比较。
为了解决这种歧义,您需要告诉编译器开放U
实际上是在启动模板实例化。
答案 1 :(得分:4)
试试这个:
return I.template f<U>();