C++ 在C+;中嵌套在模板中的类中使用基类的成员时出错+;
考虑以下示例:C++ 在C+;中嵌套在模板中的类中使用基类的成员时出错+;,c++,templates,gcc,compiler-errors,C++,Templates,Gcc,Compiler Errors,考虑以下示例: template <typename T> struct A { struct B { int b; }; struct C : B { void f() { b = 0; } }; }; 模板 结构A{ 结构B{ int b; }; 结构C:B{ void f(){ b=0; } }; }; 使用GCC 4.8.1进行编译时会出现以下错误: test.cc: In member function ‘void
template <typename T>
struct A {
struct B {
int b;
};
struct C : B {
void f() {
b = 0;
}
};
};
模板
结构A{
结构B{
int b;
};
结构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;
^
test.cc:在成员函数“void A::C::f()”中:
test.cc:9:11:错误:“b”未在此范围内声明
b=0;
^
但是,b
是父类b
的成员(我在示例中使用了struct
将所有内容公开),如果我将a
设置为非模板,则所有内容都会编译
为什么编译器会给出这个错误?我如何避免它?这在语言中是一个模糊的角落,但解决方案很简单,请确认它:
this->b = 0; // alternatively 'B::b = 0;'
原因是,没有限定的b
不是从属名称,在将实际类型替换到模板中之前,需要在第一次查找过程中解析它。此时,编译器不知道对于将被实例化的类型是否可以有A::B
的专门化,或者该专门化是否可能有B
成员