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

时间:2012-11-21 20:51:26

标签: c++ boost

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

        protected:
            virtual ~EmbeddClass() {}

    }   

    boost::scoped_ptr<EmbeddClass> scpEmbeddClass;
}

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

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

谢谢

2 个答案:

答案 0 :(得分:1)

  

问题&GT;这个问题的原因是什么?是因为scoped_ptr的析构函数无法访问受保护的~EmbeddClass?

是的,这正是问题所在。

  

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

我只能假设您没有存储EmbeddClass个对象,而是存储shared_ptr中从中派生的类型的对象。在这种情况下,共享指针的构造函数将创建一个 deleter ,它将调用派生类型最多的析构函数(如shared_ptr构造函数/ reset() /所示。 )。因为即使类型提到基类,shared_ptr也会销毁派生类型最多的类型,但它不会调用基础析构函数。

答案 1 :(得分:0)

  

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

  

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

请注意,您可以拥有多个shared_ptr拥有资源,如果您没有初始化它或者使用次数超过1,则永远不需要调用删除器。但是,scoped_ptr更像unique_ptr,它在资源上具有唯一所有权,并确保即使您不初始化它也可以删除指针。

基本上,shared_ptrscoped_ptr确实需要访问时,不拥有资源的unique_ptr不需要访问受保护的析构函数。