35

可能重复:
从模板函数调用的模板类的 C++ 模板成员函数

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 ‘&gt;’ token"
}

我可以将其更改为

b->A<T1>::template foo<T0>();

编译得很好。但是我也可以将其更改为

b.A<T1>::template foo<T0>();

编译也很好。嗯?

在原始代码的意义上,如何正确调用模板成员函数?

4

2 回答 2

63

刚找到:

根据 C++'03 标准 14.2/4:

当成员模板特化的名称出现在后缀表达式之后.->之后,或在限定标识符中的嵌套名称说明符之后,并且后缀表达式或限定标识符显式依赖于模板参数(14.6.2 ),成员模板名称必须以关键字 为前缀template。否则,该名称被假定为命名非模板。

正确的代码是:

b.template foo<T0>();
于 2012-10-01T15:25:28.287 回答
14

你可以这样调用函数:

b.template foo<T0>();
于 2012-10-01T15:27:07.447 回答