Оператор назначения шаблонной копии - PullRequest
2 голосов
/ 02 ноября 2019

Согласно cppreference, оператор присваивания копии не должен быть шаблонным:

Оператор присваивания копии класса T представляет собой не шаблон нестатическую функцию-член с именемоператор =, который принимает ровно один параметр типа T, T &, const T &, volatile T & или const volatile T & "

Но в этом примере программы, я написал шаблонный оператор присваивания, компиляция отсутствуетпроблема, и это infact называется (а не генерируется по умолчанию неявно).

template<typename T1>
class Sample
{
public:
        T1 a;
        Sample(T1 b)
        {
                a=b;
        }

        template<typename T2>
        void operator  = (T2& obj2)
        {
                cout<<"This wont be called";
                (*this).a=obj2.a;
        }

};


        Sample<int> obj1(2);
        Sample<int> obj2(3);

        obj2=obj1;

Вывод:

This wont be called

Неужели я что-то неправильно понимаю?

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

template<typename T2> void operator = (T2&) не является оператором копирования.

, поэтому генерируется значение по умолчанию void operator = (const Sample&).

, но лучше подходит для:

Sample<int> obj1(2);
Sample<int> obj2(3);
obj2 = obj1;

Но с

const Sample<int> obj1(2);
Sample<int> obj2(3);
obj2 = obj1;

Вы получите ожидаемый результат:

Демо

1 голос
/ 02 ноября 2019
template<typename T2>
    void operator=(T2& obj2) { ... }

определяет функцию operator=, но она не является оператором копирования в соответствии со стандартом. Чтобы считаться оператором копирования, оно должно быть:

void operator=(Samble& obj2) { ... }

или лучше

Sample& operator=(Sample const& obj2) { ... }

Учитывая ваш код, вы можете использовать:

Sample<int> a;
Samble<double> b;
b = a;

Если бы у вас был реальный оператор присваивания копии, он не смог бы скомпилироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...