Строка
Foo f;
создает экземпляр в стеке, и общие указатели на объекты стека не допускаются.
Во-вторых, конструктор Foo обращается к «указателю»пока строительство не закончено - вы получите исключение, что объект удален (здесь еще не построено).(где хранение общих «этих» указателей в члене обычно не очень хорошая идея).
Так что решение для вас может быть:
class Foo
: public std::enable_shared_from_this<Foo>
{
public:
Foo()
{
}
void push()
{
list_.push_back(shared_from_this());
}
private:
static std::vector<shared_ptr<Foo>> list_;
};
std::vector<shared_ptr<Foo>> Foo::list_;
int main()
{
std::shared_ptr<Foo> foo = std::make_shared<Foo>();
foo->push();
return 0;
}