重叠类型的多重继承中的歧义消除
当不同的基类具有不重叠的集时,多重继承可能会导致不明确的类成员调用多态方法的适用类型。考虑这样的场景:可变参数基类模板 Base 定义了一个方法 foo(),该方法只能使用其类型参数包中包含的模板参数来调用。
在我们的示例中:
<code class="cpp">template <typename ... Types> class Base { public: template <typename T> typename std::enable_if<Contains<T, Types ...>::value>::type foo() { std::cout << "Base::foo()\n"; } };
我们可以派生一个类 Derived,它从 Base 继承两次且类型集不重叠:
<code class="cpp">struct Derived: public Base<int, char>, public Base<double, void> {};</code>
调用 Derived().foo
为什么编译器无法解决歧义
类的合并规则-成员查找声明如果派生类(在本例中为 Derived)的声明集为空,则成员(在本例中为 foo)的查找集将从所有直接基类合并。但是,由于我们的基类对 foo 具有不同的声明集,因此合并是不明确的。
解决方法
要解决歧义,我们可以将 Derived 的声明集设为通过在基类中为 foo 方法添加 using 声明来实现非空:
<code class="cpp">struct Derived: public Base<int, char>, public Base<double, void> { using Base<int, char>::foo; using Base<double, void>::foo; };</code>
Using 声明将基类中的成员引入派生类,从而有效地为 Derived 提供两个 foo 重载。然后,编译器可以明确地调用适当的重载。
替代解决方案
以上是调用多态方法时如何解决类型重叠的多重继承中的二义性?的详细内容。更多信息请关注PHP中文网其他相关文章!