为什么我必须确定重载模板基类方法的范围
Why must I scope an overloaded template base class method?
如果没有基类的作用域,我似乎无法调用基类的方法,这似乎是因为我重载了该方法。如果我不重载该方法,那么编译器不会抱怨。下面是我想做的一个例子:
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++标准3.3.10第1段:
可以通过中相同名称的显式声明来隐藏名称嵌套的声明性区域或派生类
CCD_ 10掩盖了CCD_ 11的定义。你所需要的只是一个using
指令:
class ChildClass: public BaseClass {
public:
using BaseClass::foo;
template <class T> T& foo(int baz, T& t, int szl);
};
您需要一个using
,如:
using BaseClass::foo;
相关文章:
- 是否可以使用基类非虚拟方法中的派生类虚拟方法?
- 通过基类接受方法转发派生 UniquePtr 的右值会移动引用而不是复制
- C++初始化之前派生类调用基类的方法
- 为什么派生类的实例从基类调用方法?
- 为什么允许将派生类的方法static_cast为基类的方法?
- 从基类调用继承类的方法.C++
- 我无法重写基类的方法,因为我的派生类是模板化的
- C++继承,如何在基类的方法中调用子类的方法?
- C ++中有没有办法让派生类重写基类静态方法
- 如何将模板派生类的方法提取到非模板基类中
- 将指针从派生到基类的方法的最佳方法
- 当类不需要重写从多个基继承的方法时该怎么办
- 抽象基类的派生类未正确覆盖基纯虚拟方法
- C++抽象基模板类非空方法
- CRTP:基于派生类内容的基类启用方法
- 通过"a pointer of the base class"访问未在基类中声明的子类的方法或属性(动态)
- 当可变参数模板类继承自模板参数时,在调用基类型的方法时扩展参数包
- SWIG:在派生类中处理基类重载方法
- 在派生类的方法中使用基类的方法
- 仅通过基类"create"方法将对象创建为共享指针