неоднозначность перегрузки оператора преобразования, разные компиляторы

Я видел другие вопросы по SO, касающиеся этого, но ни один, который объясняет это полностью. Чтоправо способы для компиляторов справиться с двумя ситуациями ниже? Я пробовал это с gcc 4.7.1 (с -std = c ++ 0x), VS2010 и VS2012 получить разные результаты на всех:

Пример 1:

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

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

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

Выход:

gcc 4.7.1: хорошоVS2010: хорошоVS2012: Fail: "Невозможно преобразовать из BB в строку "

Пример 2:

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

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

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

Выход:

gcc 4.7.1: Fail: вызов перегруженной строки (BB &) неоднозначноVS2010: хорошоVS2012: Fail: "Невозможно преобразовать из BB в строку "

Ответы на вопрос(2)

Ваш ответ на вопрос