#include <iostream>
template<typename> class FirstClass;
template<typename> class SecondClass;
template <typename T>
class FirstClass {
public:
bool convert(const FirstClass<T>& f) { std::cout << "f2f\n"; }
bool convert(const SecondClass<T>& s){ std::cout << "f2s\n"; }
};
template <typename T>
class SecondClass {
public:
bool convert(const FirstClass<T>& f){ std::cout << "s2f\n"; }
bool convert(const SecondClass<T>& s){ std::cout << "s2s\n"; }
};
int main()
{
FirstClass<int> f;
SecondClass<int> s;
f.convert(f);
f.convert(s);
s.convert(f);
s.convert(s);
}
I2luY2x1ZGUgPGlvc3RyZWFtPgogCiAKdGVtcGxhdGU8dHlwZW5hbWU+IGNsYXNzIEZpcnN0Q2xhc3M7CnRlbXBsYXRlPHR5cGVuYW1lPiBjbGFzcyBTZWNvbmRDbGFzczsKIAp0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KY2xhc3MgRmlyc3RDbGFzcyB7CiAKcHVibGljOgogICAgYm9vbCBjb252ZXJ0KGNvbnN0IEZpcnN0Q2xhc3M8VD4mIGYpIHsgc3RkOjpjb3V0IDw8ICJmMmZcbiI7IH0KICAgIGJvb2wgY29udmVydChjb25zdCBTZWNvbmRDbGFzczxUPiYgcyl7IHN0ZDo6Y291dCA8PCAiZjJzXG4iOyB9CiAKfTsKIAogCnRlbXBsYXRlIDx0eXBlbmFtZSBUPgpjbGFzcyBTZWNvbmRDbGFzcyB7CiAKcHVibGljOgogICAgYm9vbCBjb252ZXJ0KGNvbnN0IEZpcnN0Q2xhc3M8VD4mIGYpeyBzdGQ6OmNvdXQgPDwgInMyZlxuIjsgfQogICAgYm9vbCBjb252ZXJ0KGNvbnN0IFNlY29uZENsYXNzPFQ+JiBzKXsgc3RkOjpjb3V0IDw8ICJzMnNcbiI7IH0KIAp9OwoKaW50IG1haW4oKQp7CiAgICBGaXJzdENsYXNzPGludD4gZjsKICAgIFNlY29uZENsYXNzPGludD4gczsKICAgIAogICAgZi5jb252ZXJ0KGYpOwogICAgZi5jb252ZXJ0KHMpOwogICAgcy5jb252ZXJ0KGYpOwogICAgcy5jb252ZXJ0KHMpOwogICAgCn0=