C++ 为什么这个虚拟呼叫模棱两可?

C++ 为什么这个虚拟呼叫模棱两可?,c++,c++11,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

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

()

dual_应用程序
不会覆盖虚拟函数
apply

您似乎认为它不应该是模糊的,因为根据参数的类型,其中一个函数无法调用。但是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;
};

您有一个从两个基类派生的类,该基类不重写
apply()
。尝试搜索继承树并满足两个或多个可行选项的虚拟调用无效。这就是你的歧义。事实上,我忘记了我的
使用了
子句。非常感谢。