我应该如何处理类型而不是方法的多重继承冲突?

时间:2016-04-25 12:51:56

标签: c++ typedef multiple-inheritance

假设我有:

class A { public: using foo_t = int; }
class B { public: using foo_t = int; }
class C : public A, public B { }

我想参考C::foo_t。是的,它必须是C::foo_t,而不是C::A::foo_tC::B::foo_t。显然,编译器抱怨模棱两可。如果这些是方法,我可以使用虚拟继承,也许可以使用mixin来形成钻石或什么不是。但是我应该为类型做些什么呢?我应该手动添加一个using语句吗?

备注:

  • 您可以假设我静态断言foo_t都是相同的。

1 个答案:

答案 0 :(得分:4)

使用声明确实足够了:

class A { public: using foo_t = int; };
class B { public: using foo_t = int; };
class C : public A, public B { public: using A::foo_t; };

int main() {
    C::foo_t v = 0;
}

这样,C::foo_t肯定是A::foo_t(正如评论中正确建议的那样) 如果您要为foo_t定义C类型或新类型,则可以执行以下操作:

class C : public A, public B { public: using bar_t = A::foo_t; };

这是一个最小的完整示例,其中使用 sfinae 而不是静态断言验证类型是否相同:

#include<type_traits>

class A { public: using foo_t = int; };
class B { public: using foo_t = int; };
class C { public: using foo_t = double; };

template<class T, class U,
    std::enable_if_t<std::is_same<typename T::foo_t, typename U::foo_t>::value>* = nullptr>
class D: public T, public U { public: using T::foo_t; };

int main() {
    D<A, B>::foo_t v = 0;
    // the line below does not compile
    //D<A, C>::foo_t v = 0;
}