Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/152.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在C+;中嵌套在模板中的类中使用基类的成员时出错+;_C++_Templates_Gcc_Compiler Errors - Fatal编程技术网

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
成员