class X {
public:
typedef std::list Container;
// (1)
const Container& GetElements() const;
// (2)
Container::iterator Element
I can't think of much cleaner methods; you might consider the lightweight (4) solution giving access with
const Container& container() const { return m_container; }
I would prefer (3) since the container type becomes fully encapsulated, i.e. your type does not necessarily require inclusion of and you can change the container type without recompiling depending modules.