来自继承结构的本地声明无法识别

时间:2014-01-19 14:51:34

标签: c++ templates

template< int a, int b >
struct aa {
  template< int x, int y >
  struct att { int axx[ a + x ][ b + y ]; };
};   

struct b1 : public aa< 1, 2 > {
  typedef att< 1, 2 > x;
};

template< int q >
struct b2 : public aa< 12, q > {
    typedef att< 1, 2 > x;
}; 

b1编译没有问题(GCC 4.8),但b2抱怨

error: 'att' does not name a type
typedef att< 1, 2 > x;
        ^   

为什么?

1 个答案:

答案 0 :(得分:1)

因为非依赖名称(例如att<1,2>)未在依赖基类中查找(例如aa<12,q>,这取决于q)。

b1的情况下,基类aa<1,2>不是依赖基础,所以一切正常。对于b2,最简单的方法是编写typename aa<12,q>::template att<1,2>

有关相关参考,请参阅C ++模板中的第9.4.2节(从属基类):完整指南(Vandevoorde和Josuttis)。