如何调用模板成员函数?

rit*_*ter 29 c++ templates

可能重复:
从模板函数调用的模板类的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 ‘>’ token"
}
Run Code Online (Sandbox Code Playgroud)

我可以改成它

b->A<T1>::template foo<T0>();
Run Code Online (Sandbox Code Playgroud)

编译好.不过我也可以改成它

b.A<T1>::template foo<T0>();
Run Code Online (Sandbox Code Playgroud)

编译也很好.是吗?

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

rit*_*ter 54

刚发现它:

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

当一个构件模板特的名称出现之后.->在一个后缀表达式,或之后的合格-ID嵌套名称说明符,和后缀表达或合格-ID明确地依赖于模板参数(14.6.2 ),成员模板名称必须以关键字为前缀template.否则,假定该名称命名非模板.

正确的代码是:

b.template foo<T0>();
Run Code Online (Sandbox Code Playgroud)

  • 这样做的原因和条件与需要“typename”时类似。 (2认同)

Nin*_*ten 13

你可以这样调用这个函数:

b.template foo<T0>();
Run Code Online (Sandbox Code Playgroud)