#include <iostream>
template<class T>
class MyClass
{
public:
template<class U>
friend class MyClass;
T value;
template<class U>
MyClass& operator=(const MyClass<U>& rhs)
{
std::cout << "Came to MyClass<T>::operator=(const MyClass<U>& rhs)\n";
return *this;
}
// Overload for MyClass<T>
MyClass& operator=(const MyClass& rhs)
{
std::cout << "Came to MyClass<T>::operator=(const MyClass& rhs)\n";
return *this;
}
};
template <> class MyClass<int> : public MyClass<long>
{
public:
template<class U>
friend class MyClass;
int value;
template<class U>
MyClass& operator=(const MyClass<U>& rhs)
{
std::cout << "Came to MyClass<int>::operator=(const MyClass<U>& rhs)\n";
return *this;
}
MyClass& operator=(const MyClass& rhs)
{
std::cout << "Came to MyClass<int>::operator=(const MyClass& rhs)\n";
return *this;
}
};
int main()
{
MyClass<int> obj1;
MyClass<long>& ref1 = obj1;
ref1 = obj1;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgoKdGVtcGxhdGU8Y2xhc3MgVD4KY2xhc3MgTXlDbGFzcwp7CiAgIHB1YmxpYzoKCiAgICB0ZW1wbGF0ZTxjbGFzcyBVPgogICAgZnJpZW5kIGNsYXNzIE15Q2xhc3M7CiAgICBUIHZhbHVlOwoKICAgIHRlbXBsYXRlPGNsYXNzIFU+CiAgICBNeUNsYXNzJiBvcGVyYXRvcj0oY29uc3QgTXlDbGFzczxVPiYgcmhzKQogICAgewogICAgICAgc3RkOjpjb3V0IDw8ICJDYW1lIHRvIE15Q2xhc3M8VD46Om9wZXJhdG9yPShjb25zdCBNeUNsYXNzPFU+JiByaHMpXG4iOwogICAgICAgcmV0dXJuICp0aGlzOwogICAgfQoKICAgIC8vIE92ZXJsb2FkIGZvciBNeUNsYXNzPFQ+CiAgICBNeUNsYXNzJiBvcGVyYXRvcj0oY29uc3QgTXlDbGFzcyYgcmhzKQogICAgewogICAgICAgc3RkOjpjb3V0IDw8ICJDYW1lIHRvIE15Q2xhc3M8VD46Om9wZXJhdG9yPShjb25zdCBNeUNsYXNzJiByaHMpXG4iOwogICAgICAgcmV0dXJuICp0aGlzOwogICAgfQp9OwoKdGVtcGxhdGUgPD4gY2xhc3MgTXlDbGFzczxpbnQ+IDogcHVibGljIE15Q2xhc3M8bG9uZz4KewogICBwdWJsaWM6CgogICAgdGVtcGxhdGU8Y2xhc3MgVT4KICAgIGZyaWVuZCBjbGFzcyBNeUNsYXNzOwogICAgaW50IHZhbHVlOwoKICAgIHRlbXBsYXRlPGNsYXNzIFU+CiAgICBNeUNsYXNzJiBvcGVyYXRvcj0oY29uc3QgTXlDbGFzczxVPiYgcmhzKQogICAgewogICAgICAgc3RkOjpjb3V0IDw8ICJDYW1lIHRvIE15Q2xhc3M8aW50Pjo6b3BlcmF0b3I9KGNvbnN0IE15Q2xhc3M8VT4mIHJocylcbiI7CiAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgTXlDbGFzcyYgb3BlcmF0b3I9KGNvbnN0IE15Q2xhc3MmIHJocykKICAgIHsKICAgICAgIHN0ZDo6Y291dCA8PCAiQ2FtZSB0byBNeUNsYXNzPGludD46Om9wZXJhdG9yPShjb25zdCBNeUNsYXNzJiByaHMpXG4iOwogICAgICAgcmV0dXJuICp0aGlzOwogICAgfQp9OwoKaW50IG1haW4oKQp7CiAgIE15Q2xhc3M8aW50PiBvYmoxOwogICBNeUNsYXNzPGxvbmc+JiByZWYxID0gb2JqMTsKCiAgIHJlZjEgPSBvYmoxOwp9CgoK