从模板函数调用的模板类的模板成员函数

这不会编译:

template<class X> struct A { template<int I> void f() {} }; template<class T> void g() { A<T> a; af<3>(); // Compilation fails here (Line 18) } int main(int argc, char *argv[]) { g<int>(); // Line 23 } 

编译器(gcc)说:

hhh.cpp:在函数'void g()':

hhh.cpp:18:错误:在')'标记之前预期的主expression式

hhh.cpp:在函数'void g()[with T = int]':

hhh.cpp:23:从这里实例化

hhh.cpp:18:错误:使用成员无效(你忘了'&'?)

任何人都可以解释为什么这是? 有没有办法让它起作用?

试试下面的代码:

 template<class T> void g() { A<T> a; a.template f<3>(); // add `template` keyword here } 

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

当成员模板专业化的名称出现后. 或者在后缀expression式中,或者在限定的id中的嵌套名称说明符之后,postfix-expression或qualified-id显式地依赖于模板参数(14.6.2),则成员模板名称必须是由关键字template作为前缀。 否则,名称被假定为命名一个非模板。

未来的C ++标准似乎仍然需要根据草案n2857 14.3 / 4这个关键字。 一些编译器有特殊的模式,允许编译原始代码而不会出错(Comeau将其编译成所谓的放松模式 )。

T型在哪里定义?

当你调用函数g()的时候,必须知道typesT,否则准备好编译器错误,说T是未定义的。

你能指定你正在使用的编译器吗? 问题中的代码与

 int main() { g<int>(); } 

使用Microsoft Visual Studio 9中的cl.exe进行编译时没有问题;

它在我尝试的各种版本的G ++和Comeau在线编译器上都失败了。