#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;
}