C++派生类vector无法访问私有继承基类vector_base成员如何解决
问题根本原因
你遇到的编译错误由两个C++语法规则共同导致:
- 派生类构造函数的初始化列表仅能初始化自身类定义的成员,无法直接初始化基类的成员,基类成员的初始化必须交由基类构造函数完成
vector_base<T>属于依赖型基类(其类型依赖模板参数T的实例化结果),C++标准规定非限定名称查找不会扫描依赖型基类的作用域,因此派生类中直接使用sz、elem、space等名称时,编译器不会到基类中匹配对应成员,直接抛出未声明错误。
修复步骤
- 所有派生类构造函数优先调用基类构造函数完成基类成员初始化,不要在派生类初始化列表中直接给基类成员赋值
- 派生类成员函数访问基类成员时,统一添加
this->前缀,或者使用vector_base<T>::限定基类成员,触发依赖型名称查找 - 注意内存分配释放逻辑统一:基类析构函数使用
alloc.deallocate释放内存,因此内存分配必须统一使用alloc.allocate,不能混用new表达式,否则会出现分配释放不匹配的未定义行为。
修正后的代码
#include <memory> template<typename T> struct vector_base{ std::allocator<T> alloc; T *elem; int sz; int space; vector_base(const std::allocator<T> &a, int n):alloc{a},elem{alloc.allocate(n)},sz{n},space{n}{} ~vector_base(){alloc.deallocate(elem,space);} }; template<typename T> class vector:private vector_base<T> { public: // 调用基类构造完成初始化 vector(): vector_base<T>(std::allocator<T>(), 0) {} explicit vector(int s): vector_base<T>(std::allocator<T>(), s) { // 访问基类成员加this->,同时用allocator构造对象,避免new的不匹配问题 for(int i = 0; i < this->sz; i++) { std::construct_at(this->elem + i, T{}); } } T &at(int n); const T &at(int n) const; void reserve(int newalloc); void resize(int newsize, T def=T()); int capacity() const { return this->space; } void push_back(const T& d); vector &operator=(const vector &a); };
验证说明
上述代码可以直接通过编译,你后续实现其他成员函数时,只要访问基类的alloc、elem、sz、space成员时统一添加this->前缀即可正常访问。
内容的提问来源于stack exchange,提问作者epixinvites
相关产品推荐
相关产品推荐

