请考虑以下代码:
struct bar { templatevoid fun0() const {} }; template struct foo { void fun1(const bar& d) { // (1) KO fun2(d).fun0 (); // (2) OK fun2(d).template fun0 (); // (3) OK d.fun0 (); } bar fun2(const bar& d) { return d; } };
第(2)和(3)行编译,但(1)失败:
error: use 'template' keyword to treat 'fun0' as a dependent template name fun2(d).fun0(); ^ template
(正如所料,如果foo
不再是模板结构,(1)也编译)
为什么bar::fun0
依赖模板名称在这里?bar
不依赖于模板参数T
的foo
.
编辑:
显然,bar::fun2
负责处理的模糊性.template
.例如,让我们添加以下2个免费函数:
bar fun3(const bar& d) { return d; } templateT fun4(const T& d) { return d; }
fun3(d).fun0
并且fun4(d).fun0
还在上下文中编译foo::fun1
.因此模糊性是由模板参数引起的foo
.
为什么fun2(d).fun0
不将其解析为对成员函数模板的调用?