这不会编译:template<class X> struct A { template<int I> void f() {}};template<class T> void g(){ A<T> a; a.f<3>(); // Compilation fails here (Line 18)}int main(int argc, char *argv[]){ g<int>(); // Line 23}编译器(gcc)说:hhh.cpp:在函数“ void g()”中:hhh.cpp:18:错误:')'标记之前的预期主表达式hhh.cpp:在函数'void g()[with T = int]'中:hhh.cpp:23:从此处实例化hhh.cpp:18:错误:成员使用无效(您忘记了“&”吗?)谁能解释为什么?有没有办法让它工作?
2 回答
一只名叫tom的猫
TA贡献1906条经验 获得超3个赞
尝试以下代码:
template<class T> void g()
{
A<T> a;
a.template f<3>(); // add `template` keyword here
}
根据C ++'03标准14.2 / 4:
当一个构件模板特的名称出现之后.或->在一个后缀 -expression或之后嵌套名说明符在一个合格-ID,和后缀表达或合格-ID明确地依赖于模板参数(14.6.2 ),则成员模板名称必须以关键字为前缀template。否则,该名称被假定为命名非模板。
根据草案n2857 14.3 / 4,未来的C ++标准似乎仍然需要此关键字。一些编译器具有特殊的模式,该模式允许编译原始代码而不会出错(Comeau以所谓的宽松模式进行编译)。
- 2 回答
- 0 关注
- 1071 浏览
添加回答
举报
0/150
提交
取消