#include <iostream>
template<typename Ty>
struct Foo
{
Foo& operator=(Foo foo){ return foo; }
private:
Foo& operator=(Foo& foo){ return foo; }
};
template<typename Ty>
struct Bar
{
template<typename U>
Bar& operator=(Bar<U> bar){ return bar; }
private:
Bar& operator=(Bar& bar){ return bar; }
};
int main()
{
Foo<int> f1, f2;
f1 = f2; // (1)
Bar<int> b1, b2;
b1 = b2; // (2)
f1 = Foo<int>(f2); // (3)
b1 = Bar<int>(b2); // (4)
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp0ZW1wbGF0ZTx0eXBlbmFtZSBUeT4Kc3RydWN0IEZvbwp7CglGb28mIG9wZXJhdG9yPShGb28gZm9vKXsgcmV0dXJuIGZvbzsgfQkKcHJpdmF0ZToKCUZvbyYgb3BlcmF0b3I9KEZvbyYgZm9vKXsgcmV0dXJuIGZvbzsgfQp9Owp0ZW1wbGF0ZTx0eXBlbmFtZSBUeT4Kc3RydWN0IEJhcgp7Cgl0ZW1wbGF0ZTx0eXBlbmFtZSBVPgoJQmFyJiBvcGVyYXRvcj0oQmFyPFU+IGJhcil7IHJldHVybiBiYXI7IH0KcHJpdmF0ZToKCUJhciYgb3BlcmF0b3I9KEJhciYgYmFyKXsgcmV0dXJuIGJhcjsgfQp9OwoKaW50IG1haW4oKQp7CglGb288aW50PiBmMSwgZjI7CglmMSA9IGYyOwkJCS8vICgxKQoJQmFyPGludD4gYjEsIGIyOwoJYjEgPSBiMjsJCQkvLyAoMikKCWYxID0gRm9vPGludD4oZjIpOyAgLy8gKDMpCgliMSA9IEJhcjxpbnQ+KGIyKTsgIC8vICg0KQp9