考虑以下示例:
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
非模板一切都在编译。
为什么编译器会出现此错误,如何避免错误?
答案 0 :(得分:5)
这是该语言中一个模糊的角落案例,但解决方案很简单,符合条件:
this->b = 0; // alternatively 'B::b = 0;'
原因是没有资格b
不是依赖名称,并且需要在查找的第一遍中解析,然后才能将实际类型替换为模板。此时,编译器不知道是否可以对将要实例化的类型的A<T>::B
进行特化,或者该特化是否可能具有b
成员。