Your implementation of Difference is far too complicated: since your lists are sorted, all you need to do is to find mismatching elements. This requires one loop where in each iteration you move
both iterators if the element is in both sets, i.e. it isn't part of the difference
the iterator for the first list in which case you have an element which is in the first set but not in the second set
the iterator for the second list in which case you have an element which is in the second set but not in the first set
Your implementation of Intersection is likewise too complicated and also needs just one loop: it would just store the common value in the cases where no element is stored for Difference(). Finally, Union() is, again, too complicated: it would store an element in every iteration, either the common one or the one skipped depending on which branch is taken. This would also yield a correct result.
Obviously, what you really want to use is
std::set_intersection(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_intersection));
std::set_union(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_union));
std::set_symmetric_difference(s0.begin(), s0.end(), s1.begin(), s1.end(),
std::back_inserter(result_difference));
assuming you have given your lists and iterators a standard interface.