ostream &operator<<(ostream &stream, const vector<T> &values) {
Второй параметр функции имеет некорректный тип (должен быть MainVector< T >)
copy(begin(values), end(values), ostream_iterator<T>(stream, " "));
Для того чтобы эта конструкция работала, нужно добавить методы begin(), end() и класс итератора
Но проще сделать через обычный for(int i=0...) stream << val[i] << _delimiter; (лабораторка же).
И посоветуйте где добавить работу с исключительными ситуацими.
Везде, где выделяется память у вас может быть исключительная ситуация bad_alloc. Добавьте сюда MainVector::MainVector(int vectorSize) и сюда void MainVector::addOneElem(const T &t)
И вообще везде, где у вас есть вызов функции, не помеченной throw(), вы должны ловить исключение. У delete[] нет исключений, поэтому в деструкторе обрабатывать исключения не надо.