2
inlafЦитата:
собственно вопрос.
template <class T> Vector<T> & operator+=(const T &ob);
Vector<T> & operator+=(const Vector<T> &ob);
в каких случаях применяется та, или иная реализация.
просто везде по разному.
Ну давайте сначала посмотрим на второй вариант. Вот пример:
template <class Type>
struct Class1
{
    Class1<Type> &operator += (const Class1<Type> &);
    const Type &GetField() const {return Field;}
    private: Type Field;
};
template <class Type>
Class1<Type> &Class1<Type>::operator += (const Class1<Type> &Object)
{
    Field=Object.GetField();
    return *this;
}
 
  Теперь, если мы захотим для объектов 
A и 
B классов 
Class1<...> написать выражение 
A+=B, то оно скомпилируется только если оба операнда будут одного типа, например 
Class1<char>.
Теперь приведу пример, похожий на ваш первый вариант:
template <class Type>
struct Class2
{
    template <class RightType>
    Class2<Type> &operator += (const Class2<RightType> &);
    const Type &GetField() const {return Field;}
    private: Type Field;
};
template <class Type>
template <class RightType>
Class2<Type> &Class2<Type>::operator += (const Class2<RightType> &Object)
{
    Field=Object.GetField();
    return *this;
}
 
  Теперь выражение 
A+=B будет работать даже если операнды будут иметь разные типы, лишь бы они были совместимы в том смысле, что если объекты объявлены как 
Class2<Type1> A; Class2<Type2> B, то 
Type1 должен либо совпадать с 
Type2, либо должен быть его суперклассом (предком), либо, в общем случае, просто должно существовать преобразование 
Type2->
Type1 (неважно, через определение оператора преобразования типов или через перегрузку операторов присваивания или ещё каким макаром).
Nota bene, что конструкцию 
template <class Type> template <class RightType> нужно записывать именно так, а не сокращенно как 
template <class Type, class RightType>.
Конечно, именно то, что вы написали выглядит очень странным, я про 
template <class T> Vector<T> & operator+=(const T &ob) говорю. Но так может выглядеть, например, объявление глобального (non-member) оператора, только в этом случае аргументов у него будет два. Или вы просто 
template <class T> зря написали, писать это перед каждым объявлением (прототипом) не нужно, только перед определением (реализацией). Кажется, именно в этом ваша ошибка (хотя их и так хватает в приведенном вами коде)... 

Дальше.
Стиль обработки run-time ошибок, это вообще улет. 

 Смотрите в сторону нормальных exception'ов.
Также вы очень странно определяете логику в некоторых перегруженных операторах, через бесконечную рекурсию. 

В операторе 
[] вообще выхода в одной из ветвей нет (нормального 
return'а)...
Ужасть... Неужели, оно собирается и работает?