编写抽象类与派生类遇未声明标识符问题:为何需用this指针?
为什么模板派生类中直接访问基类成员报错,加
this->就正常? 你遇到的是C++模板继承里的依赖基类名字查找规则问题,具体原因如下:
依赖基类的定义
你的派生类B<T>继承的基类A<T>是依赖于模板参数T的(基类的具体类型由T决定),这种基类被称为「依赖基类」。编译器的名字查找逻辑
在编译器处理模板类B的定义阶段(此时还没进行模板实例化,不知道T的具体类型),默认不会去依赖基类A<T>中查找未限定的名字(比如直接写a)。这是C++的规则:为了避免名字查找歧义,编译器不会假设依赖基类的成员结构是固定的——毕竟不同的T可能会让A<T>产生不同的成员(哪怕你这里A<T>的成员是固定的,编译器也不会做这个假设)。this->的作用
当你使用this->a时,this的类型是B<T>*,编译器会明确知道要从B<T>的继承体系中查找a,也就是会去依赖基类A<T>里查找。这触发了依赖名字查找,告诉编译器这个名字是依赖模板参数的,需要等到模板实例化时再去基类中确认成员是否存在,因此就不会报错了。
其他等价解决方法
除了用this->,还有两种方式可以解决这个问题:
- 用基类限定符访问:
A<T>::a = 0; - 在
B<T>的类内添加using声明:template <typename T> class B : public A<T> { public: using A<T>::a; // 声明继承的成员a B() { a = 0; } void show() { std::cout << "Hello, world!" << std::endl; } };
内容的提问来源于stack exchange,提问作者Kirito
相关产品推荐
相关产品推荐

