为什么 "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>()
语法简化了语法。
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>()
语法简化了语法。