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'а)...
Ужасть... Неужели, оно собирается и работает?