如何调用模板成员函数?

时间:2012-10-01 15:21:32

标签: c++ templates

  

可能重复:
  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>();

编译也很好。是吗?

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

2 个答案:

答案 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>();