为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C++
富国沪深 2019-11-27 10:46:00
这不会编译: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以所谓的宽松模式进行编译)。


查看完整回答
反对 回复 2019-11-27
?
12345678_0001

TA贡献1802条经验 获得超5个赞

template这里仍然需要将来的标准(C ++ 0x)。一些编译器只是不符合标准(VC ++)。

查看完整回答
反对 回复 2019-11-27
  • 2 回答
  • 0 关注
  • 1071 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信