我试图创建两个类,第一个使用函数的非const实现,第二个使用const实现。这是一个小例子:
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版本需要满足更多要求。 (在常量get
上调用C
也是模棱两可的,但是有一个可能的函数要调用。)
标准中是否存在此类行为的原因?谢谢!
答案 0 :(得分:18)
当编译器试图在重载解析之前弄清楚名称get
所指的实体时,就会出现歧义。它可以是类A或类B中函数的名称。为了构建重载列表,编译器只需选择要从中提取函数的类之一即可。为了解决这个问题,您可以将名称从两个基类中引入派生类中(并使它们公开):
class C : public A, public B { public: using A::get; public: using B::get; };
答案 1 :(得分:13)
问题是您实际上并没有一个统一的重载集,其中可变变量无疑是最好的,但在A
和两个不同的重载集中, B
,并且编译器不会自动将它们合并。
放入
using A::get;
using B::get;
在C
中合并重载集,从而解决歧义。