可能重复:
模板:模板功能与类的模板成员函数不兼容
template <typename T>
struct A
{
template <int I>
void f();
};
template <typename T>
void F(A<T> &a)
{
a.f<0>(); // expected primary-expression before ‘)’ token
}
int main()
{
A<int> a;
a.f<0>(); // This one is ok.
}
Run Code Online (Sandbox Code Playgroud)
这是什么一回事?
AnT*_*AnT 16
当依赖名称用于引用嵌套模板时,必须在嵌套名称前加上关键字,template以帮助编译器理解您引用的是嵌套模板并正确解析代码
template <typename T>
void F(A<T> &a)
{
a.template f<0>();
}
Run Code Online (Sandbox Code Playgroud)
main名称内部a不依赖,这就是为什么你不需要额外的template关键字.内部F名称a是依赖的,这就是需要关键字的原因.
typename当通过依赖名称引用嵌套类型名称时,这类似于extra 关键字.只是语法略有不同.