Например,
class Segment { friend bool someFunc( P_Segment p ); }; typedef boost::shared_ptr<Segment> P_Segment;
Как лучше всего объявить P_Segment, чтобы он компилировался?
В этом случае у вас нет выбора, так как вы не можете пересылать объявление typedefs.Вместо этого вам придется переадресовать объявленный класс Segment.
Segment
class Segment; typedef boost::shared_ptr<Segment> P_Segment; class Segment { friend bool someFunc( P_Segment p ); };
Ничего плохого в том, что сказали другие, но только для альтернативы:
class Segment { public: typedef boost::shared_ptr<Segment> P_Segment; friend bool someFunc( P_Segment p ); }; using Segment::P_Segment;
Другим способом было бы сделать typedef членом класса:
class Segment { typedef boost::shared_ptr<Segment> pointer; friend bool someFunc( pointer p ); };
Конечно, это изменит ваш доступ к нему, вы не должны использовать Segment::pointer вне класса.
Segment::pointer
Форвард объявляет ваш класс и после этого объявляет умный указатель (shared_ptr может принимать неполные типы):
class Segment; typedef boost::shared_ptr<Segment> Segment_PTR; class Segment { friend bool someFunc(Segment_PTR p); };