在嵌套在C++模板中的类中使用基类成员时出错

vit*_*aut 4 c++ gcc templates compiler-errors

请考虑以下示例:

template <typename T>
struct A {
  struct B {
    int b;
  };

  struct C : B {
    void f() {
      b = 0;
    }
  };
};
Run Code Online (Sandbox Code Playgroud)

使用GCC 4.8.1进行编译会出现以下错误:

test.cc: In member function ‘void A<T>::C::f()’:
test.cc:9:11: error: ‘b’ was not declared in this scope
           b = 0;
           ^
Run Code Online (Sandbox Code Playgroud)

但是,b是父类的成员B(我struct在示例中用于使所有内容都公开),如果我创建A非模板,则所有内容都会编译.

为什么编译器会出现此错误,如何避免错误?

Dav*_*eas 5

这在语言中是一个模糊的角落案例,但解决方案很简单,符合条件:

this->b = 0; // alternatively 'B::b = 0;'
Run Code Online (Sandbox Code Playgroud)

原因是没有限定b条件不是依赖名称,并且在将实际类型替换为模板之前,需要在查找的第一遍中解析它.此时,编译器不知道是否可以A<T>::B对将要实例化的类型进行特化,或者该特化是否可能具有b成员.