【问题标题】:Why can't find base class member in derived class c++为什么在派生类c++中找不到基类成员
【发布时间】:2016-02-14 07:07:58
【问题描述】:

我试图实现 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_;

};

【问题讨论】:

  • "在编译期间,调试器"。不是调试器,而是编译器。

标签: c++ templates c++11 smart-pointers


【解决方案1】:

由于ref_count_ 是一个从属名称,您应该使用

this->ref_count_

或

Aux::ref_count_

【讨论】:

  • 它是否依赖于AuxCounter 的模板参数?如何?我知道this,但这是不同的。请解释一下。
  • 其实我也很困惑。通常没有必要放置 this 或范围运算符来访问从基类派生的成员。但是为什么在这种情况下必须这样做呢?
  • @AhSengFan - 全称是S_ptr&lt;T&gt;::Aux,所以依赖于T。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2013-03-05
  • 2017-04-14
  • 2016-05-21
  • 2022-12-11
  • 1970-01-01
相关资源
最近更新 更多