Вы объявили новую свободную функцию, а не ту, которую вы объявили в определении класса.
template <class T>
typename complex<T>::complex operator/(complex<T> &c)
^^^^^^^^^^^^^^^^^^^ ^^^^^^^^
return type function name
Вы можете увидеть, чего вам там не хватает - разрешение области видимости.Вы можете перегружать только двоичные операторы как свободные функции, поэтому вы получаете ошибку компилятора.
Это будет соответствовать объявлению в классе:
template<class T>
T complex<T>::operator/(complex<T>& c)
{
// ...
}
Пример компиляции:
Ideone
Опять же, возвращать только один параметр шаблона из operator/
, вероятно, не то, что вам нужно, вместо этого вы захотите вернуть экземпляр класса.Поэтому я думаю, что вам действительно нужно это:
template<class T>
complex<T> complex<T>::operator/(const complex<T>& c)
{
// ...
}