这不编译:
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;'?)
任何人都能解释为什么会这样吗?有没有办法让它发挥作用?
答案 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在所谓的放松模式中编译它)。