为什么在派生类 c++ 中找不到基类成员

Why can't find base class member in derived class c++

本文关键字:找不到 基类 成员 c++ 派生 为什么      更新时间:2023-10-16

我试图实现shared_ptr的简化版本。但在编译过程中,编译器弹出了一个使用未声明标识符的错误。但是,我确实声明了变量。

有人能帮我弄清楚为什么吗?提前谢谢。

代码如下:

template <typename T>
class S_ptr
{
// private classes definition
private:
    template <typename T2>
    class DefaultDeleter
    {
    public:
        void operator()(T2* p) { delete p; }
    };
    class Aux
    {
        template<typename> friend class S_ptr;
    public:
        // constructor & destructor
        Aux() : ref_count_(1) {}
        virtual ~Aux() {}
        // member method
        virtual void incre() { ++ref_count_; }
        virtual void decre() = 0;
        virtual void destroy() = 0;
    protected:
        unsigned int ref_count_;  // UNDECLARED IDENTIFIER
    };
    template <typename T2, typename Deleter>
    class AuxCounter : public Aux
    {
    public:
        // constructor & destructor
        AuxCounter(T2* p, Deleter d) : ptr_(p), deleter_(d) {}
        ~AuxCounter() { decre(); }
        // member method
        void decre() override { if(--ref_count_ == 0) destroy(); } // ERROR 
        void destroy() override { deleter_(ptr_); }
        //public member
        T2* ptr_;
    private:
        Deleter deleter_;
    };
    // private class defination end
public:
    // constructor & destructor
    S_ptr(T* p) : ptr_(new T(*p))
    {
        counter_ = new AuxCounter<T, DefaultDeleter<T>>(ptr_,     DefaultDeleter<T>());
        delete p;
        p = nullptr;
    }
    template <typename T2, typename D> S_ptr(T2* p, D&& deleter) :     ptr_(new T(*p))
    {
        counter_ = new AuxCounter<T, D>(new T(*p), deleter);
        delete p;
        p = nullptr;
    }
    S_ptr(S_ptr<T>& rhs) : ptr_(rhs.ptr_), counter_(rhs.counter_) { counter_->incre(); }
    ~S_ptr() { delete counter_; }
    // assignment
    S_ptr& operator=(const S_ptr<T>& rhs)
    {
        auto temp = rhs.counter_;
    temp->incre();
    counter_->decre();
    counter_ = temp;
    ptr_ = rhs.ptr_;
    return *this;
}
// ..........
// private data member
T* ptr_;
Aux *counter_;

};

由于ref_count_是一个依赖名称,因此应该使用

this->ref_count_

Aux::ref_count_