我试图创建两个类,第一个类具有函数的非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版本需要匹配更多的需求。(在const C上调用C也是不明确的,但是有一个可能调用的函数。)这种行为在标准中有何原因?谢谢!
发布于 2019-01-18 17:09:54
当编译器试图在重载解析之前找出名称get引用的实体时,就会出现歧义。它可以是A类的函数名,也可以是B类的函数名,为了构建重载编译器的列表,编译器只需要选择一个要从中提取函数的类。为了修复它,您可以将两个基类的名称引入派生类(并使它们公开):
class C : public A, public B { public: using A::get; public: using B::get; };发布于 2019-01-18 17:13:52
问题是,实际上没有一个统一的重载集,其中可变的变体无疑是最好的,但是在A和B中有两个不同的重载集,编译器不会自动合并它们。
放
using A::get;
using B::get;在C中合并重载集,从而解决歧义.
https://stackoverflow.com/questions/54258524
复制相似问题