うーん、具体例を挙げます

class HogeContainer
 : public enable_shared_from_this(HogeContainer) {
public:
 void AddElement(const shared_ptr<Hpge> & p) {
  p->SetOwner(shared_from_this());
  hoges.push_back(p);
 }
 void RemoveElement(const shared_ptr<Hpge> & p);
private:
 list<shared_ptr<Hpge>> hoges;
};

class Hoge {
 friend HogeContainer;
public:
 �A GetOwner();
private:
 void SetOwner(�@);
 weak_ptr<HogeContainer> pOwner;
};

このばあいの�@・�Aの型は何がよいのだろうか
但し、�Aの戻り値からshared_ptrを取得できることが条件