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

这不会编译:


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:错误:成员使用无效(您忘记了“&”吗?)


谁能解释为什么?有没有办法让它工作?


富国沪深
浏览 1072回答 2
2回答

一只名叫tom的猫

尝试以下代码:template<class T> void g(){&nbsp; &nbsp;A<T> a;&nbsp; &nbsp;a.template f<3>();&nbsp; // add `template` keyword here}根据C ++'03标准14.2 / 4:当一个构件模板特的名称出现之后.或->在一个后缀 -expression或之后嵌套名说明符在一个合格-ID,和后缀表达或合格-ID明确地依赖于模板参数(14.6.2 ),则成员模板名称必须以关键字为前缀template。否则,该名称被假定为命名非模板。根据草案n2857 14.3 / 4,未来的C ++标准似乎仍然需要此关键字。一些编译器具有特殊的模式,该模式允许编译原始代码而不会出错(Comeau以所谓的宽松模式进行编译)。

12345678_0001

template这里仍然需要将来的标准(C ++ 0x)。一些编译器只是不符合标准(VC ++)。
打开App,查看更多内容
随时随地看视频慕课网APP