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

Why is "a.template foo<0>();" allowed even though "a.foo<0>();" is enough?

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>(); 更简洁、直观、表达力更强。

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

有时,在模板中,您需要编写 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++ 编译代码时会输出以下警告:

warning: 'template' keyword outside of a template [-Wc++11-extensions]

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