@Hannes: try the following code. Used it in my last project. Is not a pretty solution but works 100% an as you say there is no elegant way. This way we at least have constness and do not need to copy.

template <class T>
const std::vector<std::tr1::shared_ptr<const T> >&
constifyPointerVector(const std::vector<std::tr1::shared_ptr<T> >& vec) {
  return reinterpret_cast<const std::vector<std::tr1::shared_ptr<const T> >&>(vec);
}