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

时间:2009-12-03 14:37:17

标签: c++ templates

这不编译:

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:错误:无效使用会员(你忘了'&amp;'?)

任何人都能解释为什么会这样吗?有没有办法让它发挥作用?

1 个答案:

答案 0 :(得分:77)

请尝试以下代码:

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

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

  

成员模板专精的名称出现在 postfix - 表达式中的.->之后,或 nested-name-specifier 在 qualified-id 中,postfix-expression或qualified-id显式依赖于template-parameter(14.6.2),成员模板名称必须以关键字{{1}为前缀}。否则,假定该名称命名非模板。

根据草案n2857 14.3 / 4,未来C ++标准似乎仍然需要此关键字。一些编译器具有允许编译原始代码而没有错误的特殊模式(Comeau在所谓的放松模式中编译它)。