问题 为什么“a.template foo ();”即使“a.foo ();”已经足够了?


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>(); 足够? 


4673
2018-03-18 11:06


起源

因为在某些情况下 a.template foo<0> 是必需的,为什么不在任何地方允许它? - melpomene
template<typename T> void do_stuff() { T a; a.template foo<0>(); } ... do_stuff<A>(); - melpomene
不允许它在语言语法中需要更多的复杂性。 - juanchopanza
事实上曾经有一段时间不被允许。 C ++ 11放宽了简化语法的要求。尝试一下 -std=c++03 -pedantic-errors 并且你会让你的编译器抱怨你。 - StoryTeller
可能重复 我必须在何处以及为何要使用“模板”和“typename”关键字? - ugoren


答案:


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

警告:模板外的'template'关键字[-Wc ++ 11-extensions]

  • 在C ++ 11中,通过允许使用的语法简化了语法 a.template foo<0>() 语法到处都是

12
2018-03-18 11:15