Тот же тип для функции шаблона внутри класса шаблона

У меня есть следующий код:

#include <iostream>
using namespace std;

template<typename T> class myclass {
public:
T data;

myclass(T const & _data = T()) : data(_data) {}

template<typename U> myclass<T> & operator=(myclass<U> const & rhs) {
cout << data << " = " << rhs.data << endl;
return *this;
}
};

int main() {
myclass<double> first(1);
myclass<float> second(2);
myclass<double> third(3);
first=second;
first=third;
}

Теперь, хотя он компилируется отлично, вывод только:

1 + 2

Почему не первый = третий звонит

myclass<double> & operator=(myclass<double> const & rhs)

?

1

Решение

Оператор назначения копирования никогда не является шаблоном функции. Поскольку класс не объявляет оператор присваивания копии, компилятор генерирует его и использует этот сгенерированный оператор. Если вы добавите такой оператор, вы увидите назначение:

myclass<T>& operator= (myclass<T> const& rhs) {
std::cout << "(copy) " << data << " = " << rhs.data << '\n';
return *this;
}
1

Другие решения

Оператор копирования-назначения никогда не является шаблоном. Поскольку вы не определили его, для вас определена версия по умолчанию (которая ничего не печатает).

0