如果存在具有不同参数的继承成员,为什么对 C++ 结构函数的调用不明确?
Why is a call to a C++ struct's function ambiguous if there are inherited members with different parameters?
代码在下面。我有一个单个函数f((,并且在我的类D中有一个函数f(int(,所以如果两个函数都有不同的参数,为什么call call cligun?
struct A {
void f() {}
};
struct B: virtual A {
void f(int i) {}
};
struct C: virtual A {
void f() {}
};
struct D: B, C {
};
int main()
{
D d;
d.f(5); //ambiguous
}
此处的问题是成员名称查找,该查找是在评估哪些函数可行并应用过载分辨率之前发生的。当名称查找从两个或多个无关的基类中找到名称时,这被认为是模棱两可的查找,这立即无效。
有关更多详细信息,请在类成员定义中阅读有关不合格的名称查找的信息。(这实际上不是您在这里拥有的上下文,但是相同的规则适用于成员访问表达式。(
您可以使用合格的ID来指定要查找的基础类别来解决此问题:
d.B::f(5);
或者,您可以直接在D
中明确可见两个功能:
struct D: B, C {
using B::f;
using C::f;
};
呼叫是模棱两可的,因为即使隐藏了a的 f()
,struct d的碱基a和c均具有称为 void f()
的函数。为了消除歧义,您应该在d。
struct A {
void f() {}
};
struct B: virtual A {
void f(int i) {} // < hides A::f(), even if signature is different,
};
struct C: virtual A {
void f() {} // < hides A::f()
};
struct D: B, C {
// f(...) functions in both base... which one hides the other?
};
相关文章:
- 为什么"do while"循环不断退出,即使条件计算结果为 false?
- 为什么在全局范围内使用"extern int a"似乎不行?
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 为什么随机数生成器不在void函数中随机化数字,而在main函数中随机化
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 为什么会发生堆损坏
- 为什么使用 "this" 指针调用派生成员函数?
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 为什么比较运算符如此快速
- 为什么 Serial.println(<char[]>);返回随机字符?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 为什么不;名字在地图上是按顺序排列的吗
- 我的字符计数代码计算错误.为什么
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 为什么 std::unique 不调用 std::sort?
- 既然存在危险,为什么项目要使用-I include开关
- 为什么在运行时没有向我们提供有关分段错误的更多信息?