Jes*_*ood 2 c++ inheritance templates
例
template <typename T>
struct A
{
typedef A<T> super;
};
template <typename T>
struct B : A<T>
{
B() : super() {} // <-- HERE
};
int main()
{
}
Run Code Online (Sandbox Code Playgroud)
使用MSVC编译器,它按原样编译.但是对于gcc,我需要super()改为A<T>::super().我假设gcc在这里是正确的,但有人可以帮我理解这里的规则以及哪个编译器在技术上是正确的?
不,因为它是一个依赖名称,因为它A是一个类模板.您需要完全限定它,或使用快捷方式B::super.后者还会告诉编译器它是一个依赖名称,如果派生类也有很多模板参数,它B会非常方便,B<T, and, stuff>因为它会扩展为,因为它是注入的类名.
由于其不完整的两阶段查找,MSVC在这里是错误的.基本上,对于MSVC,所有依赖项检查和填充仅在模板实例化期间发生,而它应该在声明时进行检查.