The facts:
One option is to forward declare one of the people, as you suggest:
struct specialist;
struct manager
{
std::vector > subordinates_;
};
struct specialist
{
std::weak_ptr boss_;
};
However, if you end up having more of a tree-structure (where you have multiple layers of management, a person base class would also work:
struct person
{
virtual ~person() { }
std::weak_ptr boss_;
std::vector > subordinates_;
};
You can then derive specific classes for different types of people in the hierarchy. Whether or not you need this depends on how exactly you intend to use the classes.
If your implementation doesn't support std::shared_ptr, it may support std::tr1::shared_ptr or you can use boost::shared_ptr.