可能重复:
C++ template member function of template class called from template function
template<class T1>
class A
{
public:
template<class T0>
void foo() const {}
};
template<class T0,class T1>
void bar( const A<T1>& b )
{
b.foo<T0>(); // This throws " expected primary-expression before ‘>’ token"
}
我可以将其改为
b->A<T1>::template foo<T0>();
编译好。但是我也可以将其改为
b.A<T1>::template foo<T0>();
编译也很好。是吗?
如何在原始代码的意义上正确调用模板成员函数?
答案 0 :(得分:49)
刚刚找到它:
根据C ++'03标准14.2 / 4:
当成员模板专业化的名称出现在
.
或之后->
在postfix-expression中,或在qualified-id中的nested-name-specifier之后,postfix-expression或qualified-id显式依赖于template-parameter(14.6.2),成员模板名称必须以关键字template
作为前缀。否则,假定该名称命名非模板。
正确的代码是:
b.template foo<T0>();
答案 1 :(得分:12)
你可以这样调用这个函数:
b.template foo<T0>();