У меня вопрос. Я играл с 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);
У кого-нибудь есть подсказка, почему это так?
Это может быть (незначительным) дефектом в стандарте 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
,
enable_shared_from_this::shared_from_this()
требует:
enable_shared_from_this<T>
должен быть доступным базовым классомT
,
Но я не вижу, где Стандарт обязывает использовать эту функцию или любое другое явное требование о доступности enable_shared_from_this
Базовый класс.
Возможная реализация, приведенная в [util.smartptr.enab] / 10-11, требует доступного базового класса; поэтому я думаю, что нормативные части предназначены для обеспечения доступности.
добавлять public
до enable_shared_from_this
class Test : public enable_shared_from_this<Test>
{};