2014-09-30 125 views
2

我有一个问题。我在玩enable_shared_from_this,注意到一件奇怪的事情。这个例子正常工作:类与结构与enable_shared_from_this

#include <iostream> 
#include <memory> 
using namespace std; 

struct Test : enable_shared_from_this<Test> 
{ 
}; 

int main() { 
    shared_ptr<Test> ptr(new Test); 
    return 0; 
} 

但是,当我改变structclass它停止编译!

错误说:

 
/usr/include/c++/4.8/bits/shared_ptr_base.h:772:58: error: 
‘std::enable_shared_from_this’ is an inaccessible base of ‘Test’ 
    __enable_shared_from_this_helper(_M_refcount, __p, __p); 

有没有人有一个线索,为什么会这样?

+10

为'struct'是'public'而对于'class',这是'private'继承。 – dyp 2014-09-30 15:00:00

+0

没错。默认继承是答案。谢谢! – Jack 2014-09-30 15:09:32

回答

4

这可能是C++标准中的一个(次要)缺陷!

在示例structclass之间的差是基类的缺省可访问:

struct Test : enable_shared_from_this<Test> 

导出从enable_shared_from_this公开;

class Test : enable_shared_from_this<Test> 

导出从enable_shared_from_this私下;

但是,我找不到标准中的任何(规范)要求,需要enable_shared_from_this基本类别构造 a shared_ptr

[util.smartptr.enab]/6约enable_shared_from_this::shared_from_this()要求:

enable_shared_from_this<T>应可访问的基类的T

但我看不到标准强制要求使用该函数或任何其他明确要求关于enable_shared_from_this基类的可访问性。

[util.smartptr.enab]/10-11中给出的可能的实现方式确实需要一个可访问的基类;所以我认为规范性部分旨在要求可访问性。

1

添加默认继承publicenable_shared_from_this

class Test : public enable_shared_from_this<Test> 
{ 



};