I think that your problem is that you should probably be using make_pair here instead of tie. The point of tie is to allow functions that return tuples to have the return value assigned to multiple values at once. For example, if Get3DPoint returns a tuple<int, int, int>, then you could write
int x, y, z; tie(x, y, z) = Get3DPoint();
Because of this, tie always accepts its parameters by non-constreference so that they can be mutated. In your case, the return values of begin() and end() are temporaries, so they can't be bound to non-const references.
make_pair (and make_tuple), on the other hand, are designed to take multiple values and package them up into a single pair or tuple object that can be passed around. This is what you want to use in your function. If you change the code to read
std::pair<iterator, iterator> getSegments() { return std::make_pair(mSegments.begin(), mSegments.end()); }
Then your code should compile just fine.
Hope this helps!