【发布时间】:2018-08-27 01:54:58
【问题描述】:
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>是必需的,所以为什么不到处允许呢? -
template<typename T> void do_stuff() { T a; a.template foo<0>(); } ... do_stuff<A>(); -
不允许在此处使用将需要更复杂的语言语法。
-
事实上,曾经有一段时间是不允许的。 C++11 放宽了简化语法的要求。用
-std=c++03 -pedantic-errors试试,你的编译器会抱怨你。
标签: c++ templates syntax standards member-functions