首页 > 解决方案 > 为什么基模板类的方法和属性不能立即可用?

问题描述

当从模板基类派生时,基类的方法和属性不是立即可用的,即如果Base<T>有一个void Func(),那么Derived派生自Base<T>必须调用Base<T>::Func而不仅仅是Func

为什么我们必须在调用其构造函数时为模板基类指定模板参数?,提供以下解释:

注入的类名都在类的范围内。类成员名称也是如此。一般规则是从属基范围名称在派生模板类的定义点不可见。确实,无论 T 的注入类名Base<T>是什么Base,编译器都可以推断出Base指定注入的类名Base<T>. 但这将是另一条特殊规则。我的观点是 C++ 语言有足够多的极端情况,以及损害一致性的特殊规则。所以我很高兴看到依赖基类注入的名称没有特殊处理。- 奥利夫

在 CppCon 2020 回归基础:模板(第 1 部分,共 2 部分)中,该主题也被触及并解释为

其简单的性质是,因为不一定只有这些 [Base] 之​​一,您可以公开或私下从 Foo 中多次派生出不同类型的 [...]

Oliv 的解释很好地解释了为什么我们不能打电话Base::Func,但如果它也解释了为什么我们不能打电话Func,那我就不清楚了。

至于 CppCon 演示者的解释,当然,我们可以从多个Base实例化中得出,但我们没有。如果AB都具有void Func(),那么如果我从 派生A,我可以调用Func而不指定A::Func。只有当我从中派生A并且B如果我尝试调用Func. 我希望模板具有相同的行为:只有当我们派生于Base<T>并且Base<U>我们会得到一个歧义错误时。或者从ABase<T>就此而言。

有没有理由让事情不是这样,我在那里没有看到?

标签: c++templatesinheritance

解决方案


推荐阅读