在基类中使用std :: enable_shared_from_this

时间:2016-04-13 11:40:50

标签: c++ c++11

我希望有一个私有继承自std::enable_shared_from_this<TBASE>的基类。但是当我尝试在派生类中创建一个对象的共享指针时,编译器直接在std::enable_shared_from_this<TBASE>中进行构造函数,因此失败,因为它是一个无法访问的基础。

以下示例无法在g ++ 5.2.1上编译

#include <memory>

class Foo : private std::enable_shared_from_this<Foo>
{
    //...
};

class Bar : public Foo
{
    //...
};

int main()
{
    std::shared_ptr<Bar> spBar(new Bar);
    return 0;
}

我是否可以在Bar内指定不尝试使用无法访问的shared_ptr构造函数?

g ++错误是:

In file included from /usr/include/c++/5/bits/shared_ptr.h:52:0,
             from /usr/include/c++/5/memory:82,
             from example.cxx:1:

/usr/include/c++/5/bits/shared_ptr_base.h: In instantiation of ‘std::__shared_ptr<_Tp, _Lp>::__shared_ptr(_Tp1*) [with _Tp1 = Bar; _Tp = Bar; __gnu_cxx::_Lock_policy _Lp = (__gnu_cxx::_Lock_policy)2u]’:

/usr/include/c++/5/bits/shared_ptr.h:117:32:   required from ‘std::shared_ptr<_Tp>::shared_ptr(_Tp1*) [with _Tp1 = Bar; _Tp = Bar]’

example.cxx:15:39:   required from here

/usr/include/c++/5/bits/shared_ptr_base.h:887:36: error: ‘std::enable_shared_from_this<Foo>’ is an inaccessible base of ‘Bar’
__enable_shared_from_this_helper(_M_refcount, __p, __p);

2 个答案:

答案 0 :(得分:3)

为了不公开shared_from_this,您可以明确地将其protected(在整个层次结构中可见)或private(仅在类中可见):

#include <memory>

class Foo : public std::enable_shared_from_this<Foo>
{
private:
    using std::enable_shared_from_this<Foo>::shared_from_this;
};    

答案 1 :(得分:1)

问题出在Foo,而不是Bar。以下程序给出了相同的错误。

我认为你必须公开继承std::enable_shared_from_this<>

#include <memory>

class Foo : private std::enable_shared_from_this<Foo>
{
    //...
};

class Bar : public Foo
{
    //...
};

int main()
{
    //std::shared_ptr<Bar> spBar(new Bar);
    std::shared_ptr<Foo> spBar(new Foo);
    return 0;
}