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;
^
为什么?
答案 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)。