2014-09-30 2 views
2

У меня есть вопрос. Я играл с enable_shared_from_this и заметил странную вещь. Этот пример работает отлично:Класс vs struct с 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: 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

+0

Справа. Наследование по умолчанию - это ответ. Спасибо! – Jack

ответ

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

1

Добавить public перед enable_shared_from_this

class Test : public enable_shared_from_this<Test> 
{ 



}; 
Смежные вопросы