繁体   English   中英

错误C2248:无法访问在类中声明的受保护成员

[英]error C2248: cannot access protected member declared in class

class TClass
{
    class EmbeddClass
    {
        public:
        ....

        protected:
            virtual ~EmbeddClass() {}

    }   

    boost::scoped_ptr<EmbeddClass> scpEmbeddClass;
}

vs2010抱怨上面的代码。 我可以通过将~EmbeddClass定义为公共函数来解决此问题。

问题>此问题的原因是什么? 是因为scoped_ptr的析构函数无法访问受保护的~EmbeddClass吗? 在我看来,shared_ptr没有这样的问题。

谢谢

问题>此问题的原因是什么? 是因为scoped_ptr的析构函数无法访问受保护的〜EmbeddClass吗?

是的,这就是问题所在。

在我看来,shared_ptr没有这样的问题。

我只能假设您没有存储EmbeddClass对象,而是在shared_ptr存储EmbeddClass派生的类型的对象。 在这种情况下,共享指针的构造函数将创建一个删除程序 ,该删除程序将调用最派生类型的析构函数(如shared_ptr构造函数/ reset() / ..所示)。 因为即使派生类型shared_ptr了基本类型,但shared_ptr破坏了派生程度最大的类型,因此它不会调用基本析构函数。

是因为scoped_ptr的析构函数无法访问受保护的〜EmbeddClass吗?

是。

在我看来,shared_ptr没有这样的问题。

需要注意的是,你可以有多个shared_ptr拥有的资源,如果你不初始化或使用计数大于1,它永远不会需要调用删除器。 然而, scoped_ptr是更喜欢unique_ptr ,它拥有的独特资源的所有权和确保它可以删除该指针,即使你不进行初始化。

基本上, shared_ptr不拥有的资源并不需要访问受保护的析构函数,而scoped_ptrunique_ptr确实需要访问。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM