假设我有:
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_t
或C::B::foo_t
。显然,编译器抱怨模棱两可。如果这些是方法,我可以使用虚拟继承,也许可以使用mixin来形成钻石或什么不是。但是我应该为类型做些什么呢?我应该手动添加一个using语句吗?
备注:
答案 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;
}