为什么" a.template foo< 0>();"即使" a.foo< 0>();"够了吗?

时间:2018-03-18 11:06:55

标签: c++ templates syntax standards member-functions

struct A
{
    template<int>
    void foo()
    {}
};

int main()
{
    A a;
    a.foo<0>(); // ok
    a.template foo<0>(); // also ok
}

显然,a.foo<0>();a.template foo<0>();更简洁,直观和富有表现力。

即使a.template foo<0>();足够,为什么C ++允许a.foo<0>();

1 个答案:

答案 0 :(得分:12)

有时,在模板中,您需要编写a.template foo<0>()而不是a.foo<0>()

@melpomene在评论中给出了这个很好的例子:

template<typename T>
void do_stuff() {
  T a;
  a.template foo<0>();
}
do_stuff<A>();
  • 在C ++ 03 中,a.template foo<0>()不应在当前情况下使用。
编译代码时,

g++会输出以下警告:

  

警告:&#39>模板&#39;模板外的关键字[-Wc ++ 11-extensions]

  • 在C ++ 11 中,通过允许在任何地方使用a.template foo<0>()语法简化了语法。