Класс против структуры с 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;
}

Но когда я меняюсь struct в class он перестает компилироваться!

Ошибка говорит:

/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);

У кого-нибудь есть подсказка, почему это так?

2

Решение

Это может быть (незначительным) дефектом в стандарте 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, требует доступного базового класса; поэтому я думаю, что нормативные части предназначены для обеспечения доступности.

4

Другие решения

добавлять public до enable_shared_from_this

class Test : public enable_shared_from_this<Test>
{};
1

По вопросам рекламы [email protected]