gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:44:05 26 4
gpt4 key购买 nike

假设我有:

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 是相同的。

最佳答案

确实使用语句就够了:

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(正如评论中正确建议的那样)。
如果您想为 C 定义 foo_t 类型或新类型,您可以按如下方式进行:

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

这是一个最小的完整示例,其中使用 sfinae 而不是 static assertion 来验证类型是否相同:

#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;
}

关于c++ - 我应该如何处理类型而不是方法的多重继承冲突?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36841154/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com