基类中的typedef在继承类中可见,而不是完全限定的
Is a typedef in base class visible in inherited class without being fully qualified?
示例
template <typename T>
struct A
{
typedef A<T> super;
};
template <typename T>
struct B : A<T>
{
B() : super() {} // <-- HERE
};
int main()
{
}
使用MSVC编译器,这将按原样编译。但是,对于gcc,我需要将super()
更改为A<T>::super()
。我假设gcc在这里是正确的,但是有人能帮我理解这里的规则吗?哪个编译器在技术上是正确的?
否,因为它是一个依赖名称,因为A
是一个类模板。您需要完全限定它,或者使用快捷方式B::super
。后者还将告诉编译器它是一个依赖名称,如果派生类也有很多模板参数,则它非常方便,因为B
将扩展到B<T, and, stuff>
,因为它是注入的类名。
MSVC在这里是错误的,这要归功于它不完整的两阶段查找。基本上,对于MSVC,所有的依赖性检查和东西都只发生在模板的实例化过程中,而它应该在声明时进行检查。
相关文章:
- C++:TypeDef使用元组
- 继承函数的重载解析
- 继承期间显示未知行为的子类
- 头文件-继承c++
- 为什么在保护模式下继承升级不起作用
- 通过继承类使用来自不同命名空间的运算符
- 子目录是否继承属性,例如add_definitions,include_directories和父Cmakelist.t
- 混合组合和继承的C++问题
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 从类继承时,继承的类是否会通过父类重新定义继承的变量
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 公共与私人继承
- 为什么当一个模板类继承自另一个模板类时,需要重新指定 typedef 并限定函数调用?
- 是无限的Typedef函数指针继承
- 'typedef' C++类中自动继承吗?
- 基类中的typedef在继承类中可见,而不是完全限定的
- 如何从通过模板继承的类中提取 typedef'd 信息?
- C++名称与typedef别名和继承的名称冲突
- 用于检测非继承typedef的特性
- typedef与继承中typename的用法