示例
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在这里是正确的,但有人可以帮助我理解这里的规则以及哪个编译器在技术上是正确的?
答案 0 :(得分:6)
不,因为它是一个从属名称,因为A
是一个类模板。您需要完全限定它,或使用快捷方式B::super
。后者还会告诉编译器它是一个依赖名称,如果派生类也有很多模板参数,非常方便,因为B
将扩展为B<T, and, stuff>
,因为它是注入的类名