У меня есть два класса A
и B
, где B
является подклассом A
. Мне нужны оба класса, чтобы использовать std::enable_shared_from_this
.
Я пробовал это:
#include <memory>
#include <iostream>
#include <vector>
class A : public std::enable_shared_from_this<A> {
public:
void insertme(std::vector<std::shared_ptr<A>>& v) {
std::cout << "A::insertme\n";
v.push_back(shared_from_this());
std::cout << "OK\n";
}
};
class B : public A, public std::enable_shared_from_this<B> {
public:
void insertme(std::vector<std::shared_ptr<B>>& v) {
std::cout << "B::insertme\n";
v.push_back(std::enable_shared_from_this<B>::shared_from_this());
std::cout << "OK\n";
}
};
int main()
{
std::vector<std::shared_ptr<A>> va;
std::vector<std::shared_ptr<B>> vb;
std::shared_ptr<A> pa = std::make_shared<A>();
std::shared_ptr<B> pb = std::make_shared<B>();
pa->insertme(va);
pb->insertme(vb);
}
(Чтобы избежать неоднозначности shared_from_this()
, мне пришлось полностью квалифицировать его в B::insertme
.)
Когда я запускаю вышеупомянутую программу, я получаю такой вывод:
A::insertme
OK
B::insertme
terminate called after throwing an instance of 'std::bad_weak_ptr'
what(): bad_weak_ptr
Aborted (core dumped)
Так что A::insertme
работает, а B::insertme
- нет.
I Я использую G CC 9.1.0 под Linux.
Что я делаю не так?