operador de conversión sobrecarga ambigüedad, compiladores difieren

He visto otras preguntas sobre SO con respecto a esto, pero ninguna que lo explique por completo. Cuál es elCorrecto ¿Cómo pueden los compiladores manejar las dos situaciones a continuación? Lo he probado con gcc 4.7.1 (con -std = c ++ 0x), VS2010 y VS2012 y obtengo resultados diferentes en todos:

Ejemplo 1:

struct BB
{
 // generic cast
 template<typename T>
 operator T() const
 {   
   return 0;
 }

 // string cast
 operator std::string() const
 { 
   return string("hello");
 }
};

int main()
{
  BB b;
  string s = b;
}

Salida:

gcc 4.7.1: okVS2010: OkVS2012: Error: "No se puede convertir de BB a cadena"

Ejemplo 2:

struct BB
{
 // generic cast
 template<typename T>
 operator T() const
 {   
   return 0;
 }

 // string cast
 operator std::string() const
 { 
   return string("hello");
 }
};

int main()
{
  BB b;
  string s = (string)b;

Salida:

gcc 4.7.1: Fallo: la llamada de cadena sobrecargada (BB &) es ambiguaVS2010: OkVS2012: Error: "No se puede convertir de BB a cadena"

Respuestas a la pregunta(2)

Su respuesta a la pregunta