在下面的代码中,我无法弄清楚为什么“apply”的调用被报告为含糊不清。提供的参数(A_applicator::apply
)只有一个可接受的匹配项。注意我非常感谢参考标准,这将有助于我确定导致这种模糊性的分辨率流程。
struct A { };
struct B { };
struct A_D : public A { };
struct A_applicator {
virtual void apply( A ) { }
};
struct B_applicator {
virtual void apply( B ) { }
};
struct dual_applicator : public B_applicator, public A_applicator {
};
int main() {
dual_applicator app;
A_D d;
app.apply(d);
}
答案 0 :(得分:6)
您似乎认为它不应该是歧义,因为根据参数的类型无法调用其中一个函数。但这不是C ++名称解析的工作方式。
这是它的工作原理,或多或少:函数的名称被解析为重载集。然后参数列表用于在该集合中的函数之间进行选择。
你的问题是第一步无法完成,因为名称apply
如何使用它,可以引用两个不同的重载集,而编译器不知道使用哪一个。它甚至没有开始查看参数!
解决方案很简单:
A)说出你想要的功能:
app.A_applicator::apply(d);
B)使用using
构建一个统一的成员函数重载集,因此使用了使用参数的预期解决方案。
struct dual_applicator : public B_applicator, public A_applicator {
using A_applicator::apply;
using B_applicator::apply;
};
答案 1 :(得分:0)
类dual_applicator
不会覆盖虚函数apply
。