Implementing my own shared-ownership double-indirecting smart-pointer
I wouldn't call it SharedPtr because the contrast to a std::shared_ptr is too big, and the name too similar.
Maybe DoublePtr or alike to emphasize the double-indirection which is the crucial feature...
I would make Manager a private non-template member of your class, because it's an implementation-detail. Also, I would make it a dumb struct and put the useful function it contains (disown) into the private part of DoublePtr.
While having a default-ctor without allocation might be enough of a boon to allow a resourceless state (it probably is), there's no reason to disallow creating a pointer-group which starts as nullptr.
Thus I would remove the check in the ctor.
op= is wrong, try self-assignment. It should be disown after own.
op=(&amp;&amp;) would be better as a simple swap.
op(bool) is wrong: Use get() != nullptr.
reset and reset_all could easily be upgraded from basic to strong exception-safety (commit-or-rollback), just create a new DoublePtr and swap.
Many of your functions can and should be marked noexcept.
Also, pure observing methods should be marked const.