C++ 为什么是;a、 模板foo<;0>;();&引用;即使“允许”;a、 富<;0>;();&引用;够了吗? 结构A { 模板 void foo() {} }; int main() { A A; a、 foo();//好的 a、 模板foo();//也可以 }

C++ 为什么是;a、 模板foo<;0>;();&引用;即使“允许”;a、 富<;0>;();&引用;够了吗? 结构A { 模板 void foo() {} }; int main() { A A; a、 foo();//好的 a、 模板foo();//也可以 },c++,templates,syntax,standards,member-functions,C++,Templates,Syntax,Standards,Member Functions,显然,a.foo()比a.template foo()更简洁、直观和富有表现力 强>为什么C++允许 .A模板脚注();代码>即使a.foo()足够了吗?有时,在模板内部,您需要编写a.template foo(),而不是a.foo() @melpomene在评论中给出了一个很好的例子: struct A { template<int> void foo() {} }; int main() { A a; a.foo<0>();

显然,
a.foo()
a.template foo()更简洁、直观和富有表现力


<>强>为什么C++允许<代码> .A模板脚注();代码>即使
a.foo()
足够了吗?

有时,在模板内部,您需要编写
a.template foo()
,而不是
a.foo()

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

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

int main()
{
    A a;
    a.foo<0>(); // ok
    a.template foo<0>(); // also ok
}
模板
void do_stuff(){
Tα;
a、 模板foo();
}
做某事;

  • 在C++03中,
    a.template foo()
    不应在当前情况下使用
编译代码时,
g++
将输出以下警告:

警告:模板[-Wc++11扩展名]之外的“模板”关键字

  • 在C++11中,语法已经简化,允许在任何地方使用
    a.template foo()
    语法

因为在某些情况下,
a.template foo
是必需的,所以为什么不允许它无处不在呢?
template void do_stuff(){ta;a.template foo();}。。。做某事在这里不允许它需要更复杂的语言语法。事实上,曾经有一段时间它是不允许的。C++11放宽了简化语法的要求。用
-std=c++03-pedantic errors
试一下,你的编译器会向你抱怨的。可能是
template<typename T>
void do_stuff() {
  T a;
  a.template foo<0>();
}
do_stuff<A>();