基类中的typedef在继承类中可见,而不是完全限定的

Is a typedef in base class visible in inherited class without being fully qualified?

本文关键字:typedef 继承 基类      更新时间:2023-10-16

示例

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,所有的依赖性检查和东西都只发生在模板的实例化过程中,而它应该在声明时进行检查。