我似乎无法在不限制基类范围的情况下调用基类的方法,这似乎是因为我已经重载了该方法.如果我不重载该方法,则编译器不会抱怨.这是我想做的事的一个例子:
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.
}
};