我似乎无法在不限定基类范围的情况下调用基类的方法,这似乎是因为我重载了该方法。如果我不重载该方法,那么编译器就不会提示。这是我想做的一个例子:
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(...) 中我调用 BaseClass::foo(...) 编译器不会提示,但我在这里没有看到任何歧义,所以我很困惑为什么我需要做这个。
最佳答案
当编译器尝试将函数名与函数匹配时,它会分两步进行。在第一步中,它找到与给定名称匹配的所有函数。如果找到多个函数,它会尝试重载解析逻辑以找到最匹配的函数。
第一步,如果编译器在类中找到了一个名字,它就停止在基类中寻找同名的函数。在您的例子中,由于它在 ChildClass
中找到了一个 foo
,因此它停止在 BaseClass
中搜索名为 foo
的函数。但是,唯一匹配的foo
不匹配调用,编译器报错。
如何解决问题:
使用您在帖子中描述的方法。调用
BaseClass::foo(...)
。将
BaseClass
中的所有foo
放入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. } };
关于c++ - 为什么我必须确定重载模板基类方法的范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33717196/