c++ - 为什么基模板类的方法和属性不能立即可用?
问题描述
当从模板基类派生时,基类的方法和属性不是立即可用的,即如果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
实例化中得出,但我们没有。如果A
和B
都具有void Func()
,那么如果我从 派生A
,我可以调用Func
而不指定A::Func
。只有当我从中派生A
并且B
如果我尝试调用Func
. 我希望模板具有相同的行为:只有当我们派生于Base<T>
并且Base<U>
我们会得到一个歧义错误时。或者从A
和Base<T>
就此而言。
有没有理由让事情不是这样,我在那里没有看到?
解决方案
推荐阅读
- azure-devops - VSTS Azure DevOps:尝试仅构建和保存某些文件夹,但项目 TFS 文件夹中的所有内容正在构建和部署
- regex - 如何检查字符串是否只有字母字符和一个空格(Javascript)
- java - 升级到 Spring Boot 2.3.0 后,Mongo 和 Spark 分区失败
- swiftui - 从 SwiftUI 问题发送电子邮件
- reactjs - 预期的模拟函数被调用了一次,但它被调用了零次。在反应
- github - 如何通过精确匹配搜索 github 问题(如 Google 的双引号)
- visual-studio - 通过 Visual Studio express 2017 创建新项目时 OpenGL 设置问题?
- java - 切换到 JPMS(Java 平台模块系统)时出现 Spring NoSuchBeanDefinitionException
- python - 在替换字段中使用 lambda 的 Python 正则表达式替换函数
- java - ORA-22922 从 kotlin 应用程序将 blob 传递给 oracle 过程