可能重复:
从模板函数调用的模板类的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)