为什么常量/非常量函数重载的继承不明确
Why is inheritance of a const/non-const function overload ambiguous?
我试图创建两个类,第一个具有函数的非常量实现,第二个具有常量实现。这里有一个小例子:
class Base {
protected:
int some;
};
class A : public virtual Base {
const int& get() const {
return some;
}
};
class B : public virtual Base {
int& get() {
return some;
}
};
class C : public A, B {};
C test;
test.get(); // ambiguous
对 get
函数的调用不明确。无论 const 版本需要匹配更多要求。(在 const C
上调用 get
也是模棱两可的,但有一个可能的函数可以调用。标准中有这种行为的原因吗?谢谢!
当编译器试图在重载解析之前确定名称get
引用的实体时,就会发生歧义。它可以是类 A 或类 B 的函数名称。为了构建重载列表,编译器只需要选择一个类来拉取函数。为了修复它,您可以将两个基类中的该名称引入派生类(并使它们公开):
class C : public A, public B { public: using A::get; public: using B::get; };
问题是你实际上没有一个统一的重载集,其中可变变体无疑是最好的,而是两个不同的重载集,在A
和B
,编译器不会自动合并它们。
放
using A::get;
using B::get;
C
合并过载集,从而解决歧义。
相关文章:
- #定义c-预处理器常量..我做错了什么
- 继承函数的重载解析
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 继承期间显示未知行为的子类
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 头文件-继承c++
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 初始化依赖于子类的继承类的常量类成员
- C++继承和"常量"交互的问题
- 常量和非常量版本和继承
- 为什么常量/非常量函数重载的继承不明确
- 获取多重继承中基类的编译时常量偏移量
- 继承的常量函数
- 泛型继承将超级数据字段更改为常量 [来自硬件]
- 常量和虚拟继承
- 可视化C++构造函数、常量、继承和避免重复