5

在下面的代码中,我无法弄清楚为什么对“应用”的调用被报告为模棱两可。提供的参数 ( 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);
}

在线演示

4

2 回答 2

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;
};
于 2013-06-15T08:47:43.980 回答
0

dual_applicator不覆盖虚函数apply

于 2013-06-15T08:34:59.493 回答