Поместите этот оператор в определение вашего класса. Он должен быть участником, потому что operator=
является особенным, и вы не получите что-либо, если в любом случае будете писать его как нечлен. У оператора, не являющегося членом, есть два важных основных преимущества:
- Неявные преобразования правой и левой части вызова оператора
- Не нужно знать о внутренностях класса. Функция может быть реализована как не-член, не являющийся другом.
Для operator=
оба не могут быть использованы. Присвоение временного результата преобразования не имеет смысла, и operator=
в большинстве случаев потребуется доступ к внутренним компонентам. Кроме того, C ++ автоматически предоставляет специальный operator=
, если вы его не предоставляете (так называемый оператор копирования-назначения). Возможность перегрузить operator=
как не-член привела бы к дополнительной сложности, по-видимому, без практической выгоды, и поэтому это недопустимо.
Поэтому измените свой код так, чтобы он выглядел следующим образом (предполагается, что operator=
является , а не оператором копирования-назначения, но присваивает list<T>
что-то еще. Это не ясно из вашего вопроса):
class MyClass {
...
template<class T>
MyClass& operator=(const list<T>& lst)
{
clear();
copy(lst);
return *this;
}
...
};
Довольно стандартно, что operator=
снова возвращает ссылку на себя. Я рекомендую вам придерживаться этой практики. Он будет выглядеть знакомым для программистов и может вызвать сюрпризы, если он неожиданно вернет void
.