Перегрузка метода оператора друга в шаблонном классе

Я пытаюсь перегрузить оператор присваивания ('=') класса шаблона, но мне нужно 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= не должен быть функцией друга. Я обвиняю усталость в том, что мне удается полностью игнорировать тот факт, что объекты имеют доступ к закрытым и защищенным элементам объектов того же класса...

Другие вопросы по тегам