我似乎无法在不将范围限定到基类的情况下调用基类的方法,这似乎是因为我重载了该方法。如果我不重载该方法,那么编译器不会抱怨。这是我想做的一个例子:
struct BaseClass {
template <typename T> T& foo(T& t) {
return t;
}
};
class ChildClass: public BaseClass {
public:
// The presence of this template causes compiler confusion
template <class T> T& foo(T& t, int szl) {
return t;
}
template <class T> int bar(T& t) {
// But if I scope this as BaseClass::foo(...) it's all good
return foo(t);
}
};
int main() {
int t = 1;
ChildClass c;
c.bar(t);
}
如果在 bar(...) 中我调用 Base Class::for(...) 编译器不会抱怨,但我在这里没有看到任何歧义,所以我很困惑为什么我需要这样做这。
当编译器尝试将函数名与函数匹配时,它分两步进行。在第一步中,它找到与给定名称匹配的所有函数。如果它找到多个函数,它会尝试重载解析逻辑来找到最佳匹配函数。
第一步,如果编译器在类中找到名称,它将停止在基类中查找同名函数。在你的情况下,因为它找到了foo
in ChildClass
,它停止搜索名为的函数foo
in BaseClass
。然而,唯一匹配的foo
与调用不匹配,编译器报告错误。
如何解决问题:
使用您在帖子中描述的方法。称呼BaseClass::foo(...)
.
-
带上所有的foo
from BaseClass
纳入范围ChildClass
.
class ChildClass: public BaseClass {
public:
using BaseClass::foo;
template <class T> T& foo(int baz, T& t, int szl) {
return t;
}
template <class T> int bar(T& t) {
return sizeof(foo(1, t)); // Should work.
}
};
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)