Почему я получаю исключение для этого использования enable_shared_from_this ()? - PullRequest
0 голосов
/ 10 ноября 2018

В следующем примере что-то ускользает от меня. Почему при генерации shared_from_this генерируется обычное исключение weak_ptr, если имеется неоплаченная ссылка shared_ptr на объект, который его вызывает?

class A : std::enable_shared_from_this<A> {
public:
    static std::shared_ptr<A> create() {
        return std::shared_ptr<A>(new A());
    }
    A() {}
    void setParent(const std::shared_ptr<A>& other) {}
    std::shared_ptr<A> keep() {
        auto o = A::create();
        o->setParent(shared_from_this());
        return o;
    }
};

int main() {
    std::shared_ptr<A> a = A::create();
    auto s = a->keep();
}

Ответы [ 2 ]

0 голосов
/ 10 ноября 2018

enable_shared_from_this должен быть однозначным и доступным основанием A, чтобы библиотека могла правильно обрабатывать внутренний слабый указатель.

Ваше наследование является частным (по умолчанию используется ключевое слово class).

0 голосов
/ 10 ноября 2018

Вам необходимо публично наследовать от enable_shared_from_this, чтобы общий ptr ctor мог его видеть.

Кроме того, clang не может скомпилировать ваш пример из-за этого.

...