【问题标题】:template member function of template class called from template function从模板函数调用的模板类的模板成员函数
【发布时间】:2010-12-22 20:28:18
【问题描述】:

这不能编译:

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: error: ')' 标记之前的预期主表达式

hhh.cpp:在函数'void g() [with T = int]'中:

hhh.cpp:23: 从这里实例化

hhh.cpp:18: 错误:无效使用成员(你忘记了 '&' 吗?)

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

【问题讨论】:

  • 编译器抱怨什么?
  • 它对我有用。你是如何调用 g() 的? (正如其他人所问的那样,您遇到了什么错误?)

标签: c++ templates


【解决方案1】:

试试下面的代码:

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

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

当成员模板特化的名称出现在 postfix 表达式中的 .-&gt; 之后,或 nested-name-specifier 之后em>qualified-id,并且 postfix-expression 或qualified-id 显式依赖于模板参数(14.6.2),成员模板名称必须以关键字template 为前缀。否则,该名称被假定为命名一个非模板。

根据草案 n2857 14.3/4,未来的 C++ 标准似乎仍需要此关键字。一些编译器具有特殊模式,允许编译原始代码而不会出错(Comeau 以所谓的 relaxed mode 编译它。

【讨论】:

  • 很好看 - 我总是忘记那个。 VC++ 让它过去的事实无济于事
  • 嗯...谁会重蹈覆辙!我以前从未见过这种语法。谢谢。
  • 未来标准 (C++0x) 仍然需要template。有些编译器只是不符合标准(VC++)。
  • 是的,它还在。在草案 n2857 中找到它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多