从模板函数调用的模板类的模板成员函数
这不会编译:
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在线编译器上都失败了。