明示的に string()変換関数を呼び出さないとエラーになるのですが、
仕方ないのでしょうか?

template <class T>
class Wrapper
{
T value;
public:
Wrapper(T arg) : value(arg) {}
operator typename T() const { return value; }
friend ostream &operator<< <T>(ostream &stream, const Wrapper<T> &obj);
};

template <class T>
ostream &operator<<(ostream &stream, const Wrapper<T> &obj)
{
stream << obj.value;
return stream;
}

int main()
{
Wrapper<string> n("abc");

cout << n << endl;
cout << string(n) << endl;

}