为什么这个虚拟电话不明确?

时间:2013-06-15 07:26:51

标签: c++ c++11

在下面的代码中,我无法弄清楚为什么“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);
}

Online Demo

2 个答案:

答案 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