2

我有个问题。我正在玩,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:错误:
'std::enable_shared_from_this' 是 'Test' 的一个不可访问的基础
    __enable_shared_from_this_helper(_M_refcount, __p, __p);

有谁知道为什么会这样?

4

2 回答 2

4

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

struct示例和示例之间的区别在于class基类的默认可访问性:

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类来构造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 中给出的可能实现确实需要一个可访问的基类;所以我认为规范部分旨在要求可访问性。

于 2014-09-30T15:21:38.573 回答
1

public之前添加enable_shared_from_this

class Test : public enable_shared_from_this<Test>
{



};
于 2017-10-11T20:14:38.337 回答