2

例子

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 在这里是正确的,但是有人可以帮我理解这里的规则以及哪个编译器在技术上是正确的吗?

4

1 回答 1

6

不,因为它是一个从属名称,因为它A是一个类模板。您需要完全限定它,或者使用快捷方式B::super。后者还将告诉编译器它是一个依赖名称,如果派生类也有很多模板参数,它会非常方便,因为它B会扩展为,B<T, and, stuff>因为它是注入的类名称

由于不完整的两阶段查找,MSVC 在这里是错误的。基本上,使用 MSVC,所有的依赖检查和东西只发生在模板的实例化期间,而它应该在声明时检查。

于 2012-08-03T08:51:02.467 回答