Перегрузка метода оператора друга в шаблонном классе
Я пытаюсь перегрузить оператор присваивания ('=') класса шаблона, но мне нужно operator=
метод, чтобы быть функцией друга.
Я думаю, что это будет просто, но я делаю что-то не так, потому что код ниже вызывает ошибку компиляции:
ошибка C2801: оператор = должен быть нестатическим членом
template <typename T>
class IDataStream
{
public:
friend void operator=(const IDataStream& dataStream)
{
// set some private members, e.g.
// this->{...} = dataStream.{...};
};
}
Может кто-нибудь показать мне ошибку моих путей - я застрял на этом:(Спасибо.
3 ответа
Ваша ошибка использует friend
, который изменяет функцию с функции-члена на inline
-определенной friend
-функции.
operator=
может быть определена только как нестатическая функция-член и требует двух аргументов, неявного this
и явная правая часть.
Давайте посмотрим на стандарт C++.
§ 9.3 / 1 Функции, объявленные в определении класса, за исключением функций, объявленных с помощью спецификатора друга (11.3), называются функциями-членами этого класса. Функция-член может быть объявлена статической, и в этом случае она является статической функцией-членом своего класса (9.4); в противном случае это нестатическая функция-член своего класса (9.3.1, 9.3.2).
§ 13.5.3 / 1 Оператор присваивания должен быть реализован нестатической функцией-членом с ровно одним параметром. [..]
Так что вы не можете сделать operator=
друг.
В § 11 [class.access]:
1 Членом класса может быть
- частный; то есть его имя может использоваться только членами и друзьями класса, в котором оно объявлено.
Поскольку функция-член является членом класса, ей не требуется спецификатор друга для доступа к частным элементам данных.
Если вы хотите узнать, как правильно перегрузить оператор, пожалуйста, смотрите C++-faq Перегрузка оператора, хотя суть перегрузки operator=
рассматривается в разделе Что такое копирование и замена?,
Как указано 0x499602D2, operator=
не должен быть функцией друга. Я обвиняю усталость в том, что мне удается полностью игнорировать тот факт, что объекты имеют доступ к закрытым и защищенным элементам объектов того же класса...