#include <iostream>
using namespace std;
template <typename T> class A {
string a;
static T t;
public:
A(): a("void\n"){};
operator T() { a = "T\n"; return T(a); }
operator T&() { a = "ref T\n"; t = a; return t; }
// operator const T&() { a = "const ref T\n"; t= a; return const_cast<const T&>(t); } (*) FIX
};
template <> string A < string >::t = "zero";
int main() {
string s;
A<string> a;
s = (string)a; // uncompilible . fixed by (*)
cout << 1 << s;
s = a.operator std::string(); // works
cout << 2 << s;
s = (string&)a; // wokrs right too
cout << 3 << s;
s = (const string&)a; // fails and ambigious . fixed by (*)
cout << 4 << s;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEEgewoJc3RyaW5nIGE7CglzdGF0aWMgVCB0OwpwdWJsaWM6CQoJQSgpOiBhKCJ2b2lkXG4iKXt9OwoJb3BlcmF0b3IgVCgpIHsgYSA9ICJUXG4iOyByZXR1cm4gVChhKTsgfQoJb3BlcmF0b3IgVCYoKSB7IGEgPSAicmVmIFRcbiI7IHQgPSBhOyByZXR1cm4gdDsgfQovLwlvcGVyYXRvciBjb25zdCBUJigpIHsgYSA9ICJjb25zdCByZWYgVFxuIjsgdD0gYTsgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgVCY+KHQpOyB9CSAgKCopIEZJWAp9OwoKdGVtcGxhdGUgPD4gc3RyaW5nIEEgPCBzdHJpbmcgPjo6dCA9ICJ6ZXJvIjsKCmludCBtYWluKCkgewoJc3RyaW5nIHM7CglBPHN0cmluZz4gYTsKCXMgPSAoc3RyaW5nKWE7ICAgICAgICAgICAgLy8gdW5jb21waWxpYmxlIC4gZml4ZWQgYnkgKCopCgljb3V0IDw8IDEgPDwgczsKCXMgPSBhLm9wZXJhdG9yIHN0ZDo6c3RyaW5nKCk7IC8vIHdvcmtzCgljb3V0IDw8IDIgPDwgczsKCXMgPSAoc3RyaW5nJilhOyAgICAgICAgICAvLyB3b2tycyByaWdodCB0b28KCWNvdXQgPDwgMyA8PCBzOwoJcyA9IChjb25zdCBzdHJpbmcmKWE7IC8vIGZhaWxzIGFuZCBhbWJpZ2lvdXMgLiBmaXhlZCBieSAoKikKCWNvdXQgPDwgNCA8PCBzOwoKCXJldHVybiAwOwp9