以下代码片段在编译期间产生“对 foo 的调用不明确”错误,我想知道是否有任何方法可以解决此问题而不完全限定对 foo 的调用:
#include <iostream>
struct Base1{
void foo(int){
}
};
struct Base2{
void foo(float){
}
};
struct Derived : public Base1, public Base2{
};
int main(){
Derived d;
d.foo(5);
std::cin.get();
return 0;
}
所以,问题正如标题所说。有想法吗?我的意思是,以下工作完美无缺:
#include <iostream>
struct Base{
void foo(int){
}
};
struct Derived : public Base{
void foo(float){
}
};
int main(){
Derived d;
d.foo(5);
std::cin.get();
return 0;
}
成员查找规则在第 10.2/2 节中定义
以下步骤定义了类范围内名称查找的结果,C
。首先,考虑类及其每个基类子对象中的每个名称声明。会员姓名f
在一个子对象中B
隐藏会员姓名f
在子对象中A
if A
是基类的子对象B
. 任何如此隐藏的声明都将被排除在考虑之外。由 using 声明引入的每个声明都被视为来自 using 声明的每个子对象C
它是包含 using 声明指定的声明的类型。如果声明的结果集并非全部来自同一类型的子对象,或者该集合具有非静态成员并包含来自不同子对象的成员,则存在歧义,并且程序格式错误。否则该集合就是查找的结果。
class A {
public:
int f(int);
};
class B {
public:
int f();
};
class C : public A, public B {};
int main()
{
C c;
c.f(); // ambiguous
}
所以你可以使用using
声明A::f
and B::f
来解决这个歧义
class C : public A, public B {
using A::f;
using B::f;
};
int main()
{
C c;
c.f(); // fine
}
第二个代码可以完美地工作,因为void foo(float)
属于C的作用域。实际上d.foo(5);
calls void foo(float)
而不是int
版本。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)