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

时间:2014-04-22 14:40:42

标签: c++ templates gcc compiler-errors

考虑以下示例:

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

  struct C : B {
    void f() {
      b = 0;
    }
  };
};

使用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;
           ^

但是,b是父类B的成员(我在示例中使用struct将所有内容公开)并且如果我使A非模板一切都在编译。

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

1 个答案:

答案 0 :(得分:5)

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

this->b = 0; // alternatively 'B::b = 0;'

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